DevelopersAPI reference

Stores API

REST endpoints for stores in SKUFlow: 31 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 online storesGET /organizations/{organizationId}/storesread
Create an online storePOST /organizations/{organizationId}/storeswrite
An online storeGET /organizations/{organizationId}/stores/{storeId}read
Change an online storePATCH /organizations/{organizationId}/stores/{storeId}write
Delete an online storeDELETE /organizations/{organizationId}/stores/{storeId}sensitive
Open a store for ordersPOST /organizations/{organizationId}/stores/{storeId}/publishsensitive
Close a storePOST /organizations/{organizationId}/stores/{storeId}/closewrite
Set a store's categoriesPOST /organizations/{organizationId}/stores/{storeId}/categorieswrite
A store's salesGET /organizations/{organizationId}/stores/{storeId}/dashboardread
A store's production batchGET /organizations/{organizationId}/stores/{storeId}/batchread
Export a store's orders (CSV)GET /organizations/{organizationId}/stores/{storeId}/orders/exportread
Draft a store's banner and categoriesPOST /organizations/{organizationId}/stores/draftwrite
Upload a store picturePOST /organizations/{organizationId}/stores/imageswrite
A store's invitesGET /organizations/{organizationId}/stores/{storeId}/invitesread
Invite people to a storePOST /organizations/{organizationId}/stores/{storeId}/invitessensitive
A store's custom domainsGET /organizations/{organizationId}/stores/{storeId}/domainsread
Connect a custom domain to a storePOST /organizations/{organizationId}/stores/{storeId}/domainswrite
Check a store domain's DNS nowPOST /organizations/{organizationId}/stores/{storeId}/domains/{domainId}/verifywrite
Make a domain the store's main addressPOST /organizations/{organizationId}/stores/{storeId}/domains/{domainId}/primarywrite
Disconnect a store domainDELETE /organizations/{organizationId}/stores/{storeId}/domains/{domainId}sensitive
Remove an inviteDELETE /organizations/{organizationId}/stores/{storeId}/invites/{inviteId}sensitive
A store's productsGET /organizations/{organizationId}/stores/{storeId}/productsread
Add products to a storePOST /organizations/{organizationId}/stores/{storeId}/productswrite
Change a store productPATCH /organizations/{organizationId}/stores/{storeId}/products/{storeProductId}write
Remove a product from a storeDELETE /organizations/{organizationId}/stores/{storeId}/products/{storeProductId}sensitive
List store ordersGET /organizations/{organizationId}/store-ordersread
A store orderGET /organizations/{organizationId}/store-orders/{storeOrderId}read
Approve a company-paid orderPOST /organizations/{organizationId}/store-orders/{storeOrderId}/approvesensitive
Reject a company-paid orderPOST /organizations/{organizationId}/store-orders/{storeOrderId}/rejectsensitive
Cancel a store orderPOST /organizations/{organizationId}/store-orders/{storeOrderId}/cancelsensitive
Mark store orders fulfilledPOST /organizations/{organizationId}/store-orders/fulfilwrite

List online stores

GET /organizations/{organizationId}/stores

The business's online stores with their status, whether they take orders today, the deadline, address, products, paid/approved order count, sales and fundraiser progress. Filter by status, kind, customer or a search of names and addresses. Read-only.

Permissionstores.read (Owner, Admin, Staff, Member)
Riskread, OAuth scope skuflow.read. Read: reads only.
MCP toolstores_list (toolset stores)

Parameters

NameInTypeRequiredDescription
statusqueryenumNoDRAFT (being built), OPEN (taking orders between its dates) or CLOSED. One of DRAFT, OPEN, CLOSED.
kindqueryenumNoCOMPANY (a company's branded store), TEAM (players and parents order by a deadline), FUNDRAISER (part of each sale goes to a cause, with a goal) or RETAIL (the business's own shop). One of COMPANY, TEAM, FUNDRAISER, RETAIL.
customerIdquerystringNoOnly stores for this customer.
queryquerystringNoUp to 200 characters.
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/stores" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY"

Response

200: the answer's fields
FieldTypeDescription
totalinteger
itemsarray of object
items[].idstring
items[].namestring
items[].slugstring
items[].subdomainstringIts address on the sites domain (unique across stores and websites).
items[].kindenumCOMPANY (a company's branded store), TEAM (players and parents order by a deadline), FUNDRAISER (part of each sale goes to a cause, with a goal) or RETAIL (the business's own shop). One of COMPANY, TEAM, FUNDRAISER, RETAIL.
items[].statusenumDRAFT (being built), OPEN (taking orders between its dates) or CLOSED. One of DRAFT, OPEN, CLOSED.
items[].availabilityenumWhether it takes orders today (status and dates). One of DRAFT, NOT_OPEN_YET, OPEN, CLOSED.
items[].opensOnstring or null
items[].closesOnstring or nullThe order deadline (inclusive), YYYY-MM-DD.
items[].daysLeftinteger or null
items[].customerIdstring or null
items[].customerobject or null
items[].customer.idstring
items[].customer.namestring
items[].customer.taxExemptboolean
items[].themeobjectThe website theme: primaryColor and accentColor (#rrggbb), font (modern, classic, friendly, bold, elegant, geometric), radius (square, soft, round), headerStyle (light, dark, brand).
items[].theme.primaryColorstring
items[].theme.accentColorstring
items[].theme.fontstring
items[].theme.radiusstring
items[].theme.headerStylestring
items[].logoUrlstring or null
items[].heroImageUrlstring or null
items[].heroTitlestring or null
items[].heroTextstring or null
items[].accessenumWho may enter: PUBLIC, PASSWORD (a shared password), EMAIL_DOMAIN (an email at one of allowedEmailDomains, not verified) or INVITE (each person's own invite link). One of PUBLIC, PASSWORD, EMAIL_DOMAIN, INVITE.
items[].hasPasswordbooleanA password is set (it is never returned).
items[].allowedEmailDomainsarray of string
items[].checkoutModeenumPAY_ONLINE (shoppers pay by card on Stripe Checkout, on the business's connected account), INVOICE_ACCOUNT (the store's customer is invoiced; orders wait for approval) or FREE (the customer pays; each person spends from allowanceCents). One of PAY_ONLINE, INVOICE_ACCOUNT, FREE.
items[].requireApprovalboolean
items[].allowanceCentsinteger or null
items[].fundraiserGoalCentsinteger or null
items[].fundraiserPercentnumber or null
items[].shippingOptionsarray of objectUp to 10 items.
items[].shippingOptions[].idstring
items[].shippingOptions[].kindenumOne of SHIP, BULK, PICKUP.
items[].shippingOptions[].labelstringUp to 80 characters.
items[].shippingOptions[].rateenumOne of FREE, FLAT, TABLE.
items[].shippingOptions[].flatCentsinteger0–1000000. Default 0.
items[].shippingOptions[].tablearray of objectUp to 10 items. Default [].
items[].shippingOptions[].notestringUp to 500 characters. Default ``.
items[].taxRatenumber
items[].taxByAddressbooleanShipped orders are taxed by the business's tax rules for the address.
items[].priceModeenumCATALOG (the catalog price + decoration), MARKUP (the catalog price raised by markupPercent + decoration) or FIXED (fixedPriceCents, all in). Size upcharges add on; CATALOG and MARKUP round up to .99 when roundTo99. One of CATALOG, MARKUP, FIXED.
items[].markupPercentnumber or null
items[].roundTo99boolean
items[].policiesobjectThe policy pages as shoppers see them (the store's own words, else the default).
items[].policies.returnsstring
items[].policies.guaranteestring
items[].policies.privacystring
items[].returnsPolicystring or null
items[].guaranteePolicystring or null
items[].privacyPolicystring or null
items[].contactEmailstring or null
items[].contactPhonestring or null
items[].fulfilledBystring or null
items[].categoriesarray of object
items[].categories[].idstring
items[].categories[].namestring
items[].categories[].slugstring
items[].categories[].imageUrlstring or null
items[].categories[].sortOrderinteger
items[].productCountinteger
items[].inviteCountinteger
items[].orderCountintegerPaid or approved orders.
items[].salesCentsintegerTotals of paid or approved orders.
items[].fundraiserobject or null
items[].fundraiser.raisedCentsintegerInteger cents.
items[].fundraiser.goalCentsinteger or null
items[].fundraiser.percentnumber or nullShare of the goal raised (may pass 100).
items[].readinessarray of stringWhat must be fixed before the store can open (empty = ready).
items[].urlsobject
items[].urls.pathstringOn the app: /store/{subdomain} (always works).
items[].urls.appUrlstring
items[].urls.defaultUrlstring or nullhttps://{subdomain}.{sites domain} when the sites domain is configured.
items[].urls.customUrlstring or nullhttps://{custom domain} when the store has an ACTIVE custom domain (shopper links use it).
items[].publishedAtstring (date-time) or null
items[].closedAtstring (date-time) or null
items[].createdAtstring (date-time)
items[].updatedAtstring (date-time)

Create an online store

POST /organizations/{organizationId}/stores

Creates a DRAFT store (nothing is public until POST /stores/{storeId}/publish). Its address comes from the business and store names unless subdomain is given; shipping starts with the kind's defaults. categories adds category tiles; productIds (GET /products) adds catalog products, each in the category its kind and name suggest. To start from an AI draft of the banner and categories, call POST /stores/draft first. For a whole store in one call for a customer, see POST /workflows/store-for-customer.

Permissionstores.manage (Owner, Admin, Staff)
Riskwrite, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it.
MCP toolstores_create (toolset stores)
PlanOnline stores: the Grow plan and up.

Request body

FieldTypeRequiredDescription
namestringYesUp to 200 characters.
slugstring or nullNoURL segment in the business (made from the name when blank). Up to 80 characters.
subdomainstringNoIts address on the sites domain: 3–40 lower-case letters, numbers and hyphens. Up to 40 characters.
kindenumNoCOMPANY (a company's branded store), TEAM (players and parents order by a deadline), FUNDRAISER (part of each sale goes to a cause, with a goal) or RETAIL (the business's own shop). One of COMPANY, TEAM, FUNDRAISER, RETAIL.
customerIdstring or nullNoThe customer the store is for (GET /customers); required for INVOICE_ACCOUNT and FREE (they are billed).
opensOnstring or nullNoA calendar date in the business's own calendar, YYYY-MM-DD.
closesOnstring or nullNoThe order deadline (orders taken through the end of this day).
themeobject or nullNoThe website theme: primaryColor and accentColor (#rrggbb), font (modern, classic, friendly, bold, elegant, geometric), radius (square, soft, round), headerStyle (light, dark, brand).
theme.primaryColorstringNo
theme.accentColorstringNo
theme.fontstringNo
theme.radiusstringNo
theme.headerStylestringNo
logoUrlstring or nullNoAn image from POST /stores/images (/image-proxy/avatars/store-…) or an https URL. Up to 2000 characters.
heroImageUrlstring or nullNoAn image from POST /stores/images (/image-proxy/avatars/store-…) or an https URL. Up to 2000 characters.
heroTitlestring or nullNoUp to 120 characters.
heroTextstring or nullNoUp to 400 characters.
accessenumNoWho may enter: PUBLIC, PASSWORD (a shared password), EMAIL_DOMAIN (an email at one of allowedEmailDomains, not verified) or INVITE (each person's own invite link). One of PUBLIC, PASSWORD, EMAIL_DOMAIN, INVITE.
passwordstring or nullNoSets the store password (PASSWORD access); null removes it. Never returned. Up to 100 characters.
allowedEmailDomainsarray of stringNoUp to 20 items.
checkoutModeenumNoPAY_ONLINE (shoppers pay by card on Stripe Checkout, on the business's connected account), INVOICE_ACCOUNT (the store's customer is invoiced; orders wait for approval) or FREE (the customer pays; each person spends from allowanceCents). One of PAY_ONLINE, INVOICE_ACCOUNT, FREE.
requireApprovalbooleanNo
allowanceCentsinteger or nullNoFree: what each person may spend, in cents. 0–100000000.
fundraiserGoalCentsinteger or nullNo0–100000000.
fundraiserPercentnumber or nullNoFundraiser: the share of each order's goods subtotal raised, percent. 0–100.
shippingOptionsarray of objectNoChoices at checkout: kind SHIP (to each person; rate FREE, FLAT flatCents or TABLE by goods subtotal), BULK (one delivery to the organization) or PICKUP; note shows under the choice. Up to 10 items.
shippingOptions[].idstringYes
shippingOptions[].kindenumYesOne of SHIP, BULK, PICKUP.
shippingOptions[].labelstringYesUp to 80 characters.
shippingOptions[].rateenumYesOne of FREE, FLAT, TABLE.
shippingOptions[].flatCentsintegerNo0–1000000. Default 0.
shippingOptions[].tablearray of objectNoUp to 10 items. Default [].
shippingOptions[].table[].minSubtotalCentsintegerYes0–100000000.
shippingOptions[].table[].centsintegerYes0–1000000.
shippingOptions[].notestringNoUp to 500 characters. Default ``.
taxRatenumberNoSales tax percent on goods and shipping (as invoices); tax-exempt customers pay none. With taxByAddress, the rate where no tax rule covers the address (and of pickup and bulk orders). 0–30.
taxByAddressbooleanNoTax shipped orders by the business's tax rules for the ship-to address (Settings → Taxes) instead of one rate.
priceModeenumNoCATALOG (the catalog price + decoration), MARKUP (the catalog price raised by markupPercent + decoration) or FIXED (fixedPriceCents, all in). Size upcharges add on; CATALOG and MARKUP round up to .99 when roundTo99. One of CATALOG, MARKUP, FIXED.
markupPercentnumber or nullNo0–1000.
roundTo99booleanNo
returnsPolicystring or nullNoYour returns policy; null = the default wording.
guaranteePolicystring or nullNo
privacyPolicystring or nullNo
contactEmailempty string or string (email) or nullNo
contactPhonestring or nullNoUp to 40 characters.
fulfilledBystring or nullNo"Fulfilled by …" in the footer; null = the business's name. Up to 200 characters.
categoriesarray of objectNoUp to 30 items.
categories[].namestringYesUp to 60 characters.
categories[].imageUrlstring or nullNoAn image from POST /stores/images (/image-proxy/avatars/store-…) or an https URL. Up to 2000 characters.
productIdsarray of stringNoCatalog products to sell. Up to 300 items.

Example

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

Response

201: the answer's fields
FieldTypeDescription
idstring
namestring
slugstring
subdomainstringIts address on the sites domain (unique across stores and websites).
kindenumCOMPANY (a company's branded store), TEAM (players and parents order by a deadline), FUNDRAISER (part of each sale goes to a cause, with a goal) or RETAIL (the business's own shop). One of COMPANY, TEAM, FUNDRAISER, RETAIL.
statusenumDRAFT (being built), OPEN (taking orders between its dates) or CLOSED. One of DRAFT, OPEN, CLOSED.
availabilityenumWhether it takes orders today (status and dates). One of DRAFT, NOT_OPEN_YET, OPEN, CLOSED.
opensOnstring or null
closesOnstring or nullThe order deadline (inclusive), YYYY-MM-DD.
daysLeftinteger or null
customerIdstring or null
customerobject or null
customer.idstring
customer.namestring
customer.taxExemptboolean
themeobjectThe website theme: primaryColor and accentColor (#rrggbb), font (modern, classic, friendly, bold, elegant, geometric), radius (square, soft, round), headerStyle (light, dark, brand).
theme.primaryColorstring
theme.accentColorstring
theme.fontstring
theme.radiusstring
theme.headerStylestring
logoUrlstring or null
heroImageUrlstring or null
heroTitlestring or null
heroTextstring or null
accessenumWho may enter: PUBLIC, PASSWORD (a shared password), EMAIL_DOMAIN (an email at one of allowedEmailDomains, not verified) or INVITE (each person's own invite link). One of PUBLIC, PASSWORD, EMAIL_DOMAIN, INVITE.
hasPasswordbooleanA password is set (it is never returned).
allowedEmailDomainsarray of string
checkoutModeenumPAY_ONLINE (shoppers pay by card on Stripe Checkout, on the business's connected account), INVOICE_ACCOUNT (the store's customer is invoiced; orders wait for approval) or FREE (the customer pays; each person spends from allowanceCents). One of PAY_ONLINE, INVOICE_ACCOUNT, FREE.
requireApprovalboolean
allowanceCentsinteger or null
fundraiserGoalCentsinteger or null
fundraiserPercentnumber or null
shippingOptionsarray of objectUp to 10 items.
shippingOptions[].idstring
shippingOptions[].kindenumOne of SHIP, BULK, PICKUP.
shippingOptions[].labelstringUp to 80 characters.
shippingOptions[].rateenumOne of FREE, FLAT, TABLE.
shippingOptions[].flatCentsinteger0–1000000. Default 0.
shippingOptions[].tablearray of objectUp to 10 items. Default [].
shippingOptions[].table[].minSubtotalCentsinteger0–100000000.
shippingOptions[].table[].centsinteger0–1000000.
shippingOptions[].notestringUp to 500 characters. Default ``.
taxRatenumber
taxByAddressbooleanShipped orders are taxed by the business's tax rules for the address.
priceModeenumCATALOG (the catalog price + decoration), MARKUP (the catalog price raised by markupPercent + decoration) or FIXED (fixedPriceCents, all in). Size upcharges add on; CATALOG and MARKUP round up to .99 when roundTo99. One of CATALOG, MARKUP, FIXED.
markupPercentnumber or null
roundTo99boolean
policiesobjectThe policy pages as shoppers see them (the store's own words, else the default).
policies.returnsstring
policies.guaranteestring
policies.privacystring
returnsPolicystring or null
guaranteePolicystring or null
privacyPolicystring or null
contactEmailstring or null
contactPhonestring or null
fulfilledBystring or null
categoriesarray of object
categories[].idstring
categories[].namestring
categories[].slugstring
categories[].imageUrlstring or null
categories[].sortOrderinteger
productCountinteger
inviteCountinteger
orderCountintegerPaid or approved orders.
salesCentsintegerTotals of paid or approved orders.
fundraiserobject or null
fundraiser.raisedCentsintegerInteger cents.
fundraiser.goalCentsinteger or null
fundraiser.percentnumber or nullShare of the goal raised (may pass 100).
readinessarray of stringWhat must be fixed before the store can open (empty = ready).
urlsobject
urls.pathstringOn the app: /store/{subdomain} (always works).
urls.appUrlstring
urls.defaultUrlstring or nullhttps://{subdomain}.{sites domain} when the sites domain is configured.
urls.customUrlstring or nullhttps://{custom domain} when the store has an ACTIVE custom domain (shopper links use it).
publishedAtstring (date-time) or null
closedAtstring (date-time) or null
createdAtstring (date-time)
updatedAtstring (date-time)

An online store

GET /organizations/{organizationId}/stores/{storeId}

One store with its branding, categories, access, checkout, shipping, tax, pricing, policies (as shown), addresses, sales, fundraiser progress and readiness (what must be fixed before it can open). Read-only.

Permissionstores.read (Owner, Admin, Staff, Member)
Riskread, OAuth scope skuflow.read. Read: reads only.
MCP toolstores_get (toolset stores)

Parameters

NameInTypeRequiredDescription
storeIdpathstringYesThe store (GET /stores).

Example

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

Response

200: the answer's fields
FieldTypeDescription
idstring
namestring
slugstring
subdomainstringIts address on the sites domain (unique across stores and websites).
kindenumCOMPANY (a company's branded store), TEAM (players and parents order by a deadline), FUNDRAISER (part of each sale goes to a cause, with a goal) or RETAIL (the business's own shop). One of COMPANY, TEAM, FUNDRAISER, RETAIL.
statusenumDRAFT (being built), OPEN (taking orders between its dates) or CLOSED. One of DRAFT, OPEN, CLOSED.
availabilityenumWhether it takes orders today (status and dates). One of DRAFT, NOT_OPEN_YET, OPEN, CLOSED.
opensOnstring or null
closesOnstring or nullThe order deadline (inclusive), YYYY-MM-DD.
daysLeftinteger or null
customerIdstring or null
customerobject or null
customer.idstring
customer.namestring
customer.taxExemptboolean
themeobjectThe website theme: primaryColor and accentColor (#rrggbb), font (modern, classic, friendly, bold, elegant, geometric), radius (square, soft, round), headerStyle (light, dark, brand).
theme.primaryColorstring
theme.accentColorstring
theme.fontstring
theme.radiusstring
theme.headerStylestring
logoUrlstring or null
heroImageUrlstring or null
heroTitlestring or null
heroTextstring or null
accessenumWho may enter: PUBLIC, PASSWORD (a shared password), EMAIL_DOMAIN (an email at one of allowedEmailDomains, not verified) or INVITE (each person's own invite link). One of PUBLIC, PASSWORD, EMAIL_DOMAIN, INVITE.
hasPasswordbooleanA password is set (it is never returned).
allowedEmailDomainsarray of string
checkoutModeenumPAY_ONLINE (shoppers pay by card on Stripe Checkout, on the business's connected account), INVOICE_ACCOUNT (the store's customer is invoiced; orders wait for approval) or FREE (the customer pays; each person spends from allowanceCents). One of PAY_ONLINE, INVOICE_ACCOUNT, FREE.
requireApprovalboolean
allowanceCentsinteger or null
fundraiserGoalCentsinteger or null
fundraiserPercentnumber or null
shippingOptionsarray of objectUp to 10 items.
shippingOptions[].idstring
shippingOptions[].kindenumOne of SHIP, BULK, PICKUP.
shippingOptions[].labelstringUp to 80 characters.
shippingOptions[].rateenumOne of FREE, FLAT, TABLE.
shippingOptions[].flatCentsinteger0–1000000. Default 0.
shippingOptions[].tablearray of objectUp to 10 items. Default [].
shippingOptions[].table[].minSubtotalCentsinteger0–100000000.
shippingOptions[].table[].centsinteger0–1000000.
shippingOptions[].notestringUp to 500 characters. Default ``.
taxRatenumber
taxByAddressbooleanShipped orders are taxed by the business's tax rules for the address.
priceModeenumCATALOG (the catalog price + decoration), MARKUP (the catalog price raised by markupPercent + decoration) or FIXED (fixedPriceCents, all in). Size upcharges add on; CATALOG and MARKUP round up to .99 when roundTo99. One of CATALOG, MARKUP, FIXED.
markupPercentnumber or null
roundTo99boolean
policiesobjectThe policy pages as shoppers see them (the store's own words, else the default).
policies.returnsstring
policies.guaranteestring
policies.privacystring
returnsPolicystring or null
guaranteePolicystring or null
privacyPolicystring or null
contactEmailstring or null
contactPhonestring or null
fulfilledBystring or null
categoriesarray of object
categories[].idstring
categories[].namestring
categories[].slugstring
categories[].imageUrlstring or null
categories[].sortOrderinteger
productCountinteger
inviteCountinteger
orderCountintegerPaid or approved orders.
salesCentsintegerTotals of paid or approved orders.
fundraiserobject or null
fundraiser.raisedCentsintegerInteger cents.
fundraiser.goalCentsinteger or null
fundraiser.percentnumber or nullShare of the goal raised (may pass 100).
readinessarray of stringWhat must be fixed before the store can open (empty = ready).
urlsobject
urls.pathstringOn the app: /store/{subdomain} (always works).
urls.appUrlstring
urls.defaultUrlstring or nullhttps://{subdomain}.{sites domain} when the sites domain is configured.
urls.customUrlstring or nullhttps://{custom domain} when the store has an ACTIVE custom domain (shopper links use it).
publishedAtstring (date-time) or null
closedAtstring (date-time) or null
createdAtstring (date-time)
updatedAtstring (date-time)

Change an online store

PATCH /organizations/{organizationId}/stores/{storeId}

Changes the fields sent. Changing the password, the access kind or the email domains sends every shopper back through the gate. An OPEN store changes for shoppers at once.

Permissionstores.manage (Owner, Admin, Staff)
Riskwrite, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it.
MCP toolstores_update (toolset stores)
PlanOnline stores: the Grow plan and up.

Parameters

NameInTypeRequiredDescription
storeIdpathstringYesThe store (GET /stores).

Request body

FieldTypeRequiredDescription
namestringNoUp to 200 characters.
slugstring or nullNoURL segment in the business (made from the name when blank). Up to 80 characters.
subdomainstringNoIts address on the sites domain: 3–40 lower-case letters, numbers and hyphens. Up to 40 characters.
kindenumNoCOMPANY (a company's branded store), TEAM (players and parents order by a deadline), FUNDRAISER (part of each sale goes to a cause, with a goal) or RETAIL (the business's own shop). One of COMPANY, TEAM, FUNDRAISER, RETAIL.
customerIdstring or nullNoThe customer the store is for (GET /customers); required for INVOICE_ACCOUNT and FREE (they are billed).
opensOnstring or nullNoA calendar date in the business's own calendar, YYYY-MM-DD.
closesOnstring or nullNoThe order deadline (orders taken through the end of this day).
themeobject or nullNoThe website theme: primaryColor and accentColor (#rrggbb), font (modern, classic, friendly, bold, elegant, geometric), radius (square, soft, round), headerStyle (light, dark, brand).
theme.primaryColorstringNo
theme.accentColorstringNo
theme.fontstringNo
theme.radiusstringNo
theme.headerStylestringNo
logoUrlstring or nullNoAn image from POST /stores/images (/image-proxy/avatars/store-…) or an https URL. Up to 2000 characters.
heroImageUrlstring or nullNoAn image from POST /stores/images (/image-proxy/avatars/store-…) or an https URL. Up to 2000 characters.
heroTitlestring or nullNoUp to 120 characters.
heroTextstring or nullNoUp to 400 characters.
accessenumNoWho may enter: PUBLIC, PASSWORD (a shared password), EMAIL_DOMAIN (an email at one of allowedEmailDomains, not verified) or INVITE (each person's own invite link). One of PUBLIC, PASSWORD, EMAIL_DOMAIN, INVITE.
passwordstring or nullNoSets the store password (PASSWORD access); null removes it. Never returned. Up to 100 characters.
allowedEmailDomainsarray of stringNoUp to 20 items.
checkoutModeenumNoPAY_ONLINE (shoppers pay by card on Stripe Checkout, on the business's connected account), INVOICE_ACCOUNT (the store's customer is invoiced; orders wait for approval) or FREE (the customer pays; each person spends from allowanceCents). One of PAY_ONLINE, INVOICE_ACCOUNT, FREE.
requireApprovalbooleanNo
allowanceCentsinteger or nullNoFree: what each person may spend, in cents. 0–100000000.
fundraiserGoalCentsinteger or nullNo0–100000000.
fundraiserPercentnumber or nullNoFundraiser: the share of each order's goods subtotal raised, percent. 0–100.
shippingOptionsarray of objectNoChoices at checkout: kind SHIP (to each person; rate FREE, FLAT flatCents or TABLE by goods subtotal), BULK (one delivery to the organization) or PICKUP; note shows under the choice. Up to 10 items.
shippingOptions[].idstringYes
shippingOptions[].kindenumYesOne of SHIP, BULK, PICKUP.
shippingOptions[].labelstringYesUp to 80 characters.
shippingOptions[].rateenumYesOne of FREE, FLAT, TABLE.
shippingOptions[].flatCentsintegerNo0–1000000. Default 0.
shippingOptions[].tablearray of objectNoUp to 10 items. Default [].
shippingOptions[].table[].minSubtotalCentsintegerYes0–100000000.
shippingOptions[].table[].centsintegerYes0–1000000.
shippingOptions[].notestringNoUp to 500 characters. Default ``.
taxRatenumberNoSales tax percent on goods and shipping (as invoices); tax-exempt customers pay none. With taxByAddress, the rate where no tax rule covers the address (and of pickup and bulk orders). 0–30.
taxByAddressbooleanNoTax shipped orders by the business's tax rules for the ship-to address (Settings → Taxes) instead of one rate.
priceModeenumNoCATALOG (the catalog price + decoration), MARKUP (the catalog price raised by markupPercent + decoration) or FIXED (fixedPriceCents, all in). Size upcharges add on; CATALOG and MARKUP round up to .99 when roundTo99. One of CATALOG, MARKUP, FIXED.
markupPercentnumber or nullNo0–1000.
roundTo99booleanNo
returnsPolicystring or nullNoYour returns policy; null = the default wording.
guaranteePolicystring or nullNo
privacyPolicystring or nullNo
contactEmailempty string or string (email) or nullNo
contactPhonestring or nullNoUp to 40 characters.
fulfilledBystring or nullNo"Fulfilled by …" in the footer; null = the business's name. Up to 200 characters.

Example

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

Response

200: the answer's fields
FieldTypeDescription
idstring
namestring
slugstring
subdomainstringIts address on the sites domain (unique across stores and websites).
kindenumCOMPANY (a company's branded store), TEAM (players and parents order by a deadline), FUNDRAISER (part of each sale goes to a cause, with a goal) or RETAIL (the business's own shop). One of COMPANY, TEAM, FUNDRAISER, RETAIL.
statusenumDRAFT (being built), OPEN (taking orders between its dates) or CLOSED. One of DRAFT, OPEN, CLOSED.
availabilityenumWhether it takes orders today (status and dates). One of DRAFT, NOT_OPEN_YET, OPEN, CLOSED.
opensOnstring or null
closesOnstring or nullThe order deadline (inclusive), YYYY-MM-DD.
daysLeftinteger or null
customerIdstring or null
customerobject or null
customer.idstring
customer.namestring
customer.taxExemptboolean
themeobjectThe website theme: primaryColor and accentColor (#rrggbb), font (modern, classic, friendly, bold, elegant, geometric), radius (square, soft, round), headerStyle (light, dark, brand).
theme.primaryColorstring
theme.accentColorstring
theme.fontstring
theme.radiusstring
theme.headerStylestring
logoUrlstring or null
heroImageUrlstring or null
heroTitlestring or null
heroTextstring or null
accessenumWho may enter: PUBLIC, PASSWORD (a shared password), EMAIL_DOMAIN (an email at one of allowedEmailDomains, not verified) or INVITE (each person's own invite link). One of PUBLIC, PASSWORD, EMAIL_DOMAIN, INVITE.
hasPasswordbooleanA password is set (it is never returned).
allowedEmailDomainsarray of string
checkoutModeenumPAY_ONLINE (shoppers pay by card on Stripe Checkout, on the business's connected account), INVOICE_ACCOUNT (the store's customer is invoiced; orders wait for approval) or FREE (the customer pays; each person spends from allowanceCents). One of PAY_ONLINE, INVOICE_ACCOUNT, FREE.
requireApprovalboolean
allowanceCentsinteger or null
fundraiserGoalCentsinteger or null
fundraiserPercentnumber or null
shippingOptionsarray of objectUp to 10 items.
shippingOptions[].idstring
shippingOptions[].kindenumOne of SHIP, BULK, PICKUP.
shippingOptions[].labelstringUp to 80 characters.
shippingOptions[].rateenumOne of FREE, FLAT, TABLE.
shippingOptions[].flatCentsinteger0–1000000. Default 0.
shippingOptions[].tablearray of objectUp to 10 items. Default [].
shippingOptions[].table[].minSubtotalCentsinteger0–100000000.
shippingOptions[].table[].centsinteger0–1000000.
shippingOptions[].notestringUp to 500 characters. Default ``.
taxRatenumber
taxByAddressbooleanShipped orders are taxed by the business's tax rules for the address.
priceModeenumCATALOG (the catalog price + decoration), MARKUP (the catalog price raised by markupPercent + decoration) or FIXED (fixedPriceCents, all in). Size upcharges add on; CATALOG and MARKUP round up to .99 when roundTo99. One of CATALOG, MARKUP, FIXED.
markupPercentnumber or null
roundTo99boolean
policiesobjectThe policy pages as shoppers see them (the store's own words, else the default).
policies.returnsstring
policies.guaranteestring
policies.privacystring
returnsPolicystring or null
guaranteePolicystring or null
privacyPolicystring or null
contactEmailstring or null
contactPhonestring or null
fulfilledBystring or null
categoriesarray of object
categories[].idstring
categories[].namestring
categories[].slugstring
categories[].imageUrlstring or null
categories[].sortOrderinteger
productCountinteger
inviteCountinteger
orderCountintegerPaid or approved orders.
salesCentsintegerTotals of paid or approved orders.
fundraiserobject or null
fundraiser.raisedCentsintegerInteger cents.
fundraiser.goalCentsinteger or null
fundraiser.percentnumber or nullShare of the goal raised (may pass 100).
readinessarray of stringWhat must be fixed before the store can open (empty = ready).
urlsobject
urls.pathstringOn the app: /store/{subdomain} (always works).
urls.appUrlstring
urls.defaultUrlstring or nullhttps://{subdomain}.{sites domain} when the sites domain is configured.
urls.customUrlstring or nullhttps://{custom domain} when the store has an ACTIVE custom domain (shopper links use it).
publishedAtstring (date-time) or null
closedAtstring (date-time) or null
createdAtstring (date-time)
updatedAtstring (date-time)

Delete an online store

DELETE /organizations/{organizationId}/stores/{storeId}

Destructive: deletes a store that never took an order, with its products, categories, invites and shopper carts; its address stops working. A store with orders is 409: close it instead.

Permissionstores.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 toolstores_delete (toolset stores)
ApprovalOver MCP, this tool always waits for your approval in SKUFlow. See Approvals.

Parameters

NameInTypeRequiredDescription
storeIdpathstringYesThe store (GET /stores).

Example

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

Response

200: the answer's fields
FieldTypeDescription
deletedtrue

Open a store for orders

POST /organizations/{organizationId}/stores/{storeId}/publish

Customer-visible: makes the store public at its address and takes orders between its dates (a CLOSED store reopens). 409 with the list when something is missing (readiness: products, shipping, the paying customer, the allowance, the password, email domains, the fundraiser share).

Permissionstores.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 toolstores_publish (toolset stores)
PlanOnline stores: the Grow plan and up.
ApprovalOver MCP, this tool asks for your OK first (in the AI app when it supports it, otherwise in SKUFlow). See Approvals.

Parameters

NameInTypeRequiredDescription
storeIdpathstringYesThe store (GET /stores).

Example

curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/stores/{storeId}/publish" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY"

Response

200: the answer's fields
FieldTypeDescription
idstring
namestring
slugstring
subdomainstringIts address on the sites domain (unique across stores and websites).
kindenumCOMPANY (a company's branded store), TEAM (players and parents order by a deadline), FUNDRAISER (part of each sale goes to a cause, with a goal) or RETAIL (the business's own shop). One of COMPANY, TEAM, FUNDRAISER, RETAIL.
statusenumDRAFT (being built), OPEN (taking orders between its dates) or CLOSED. One of DRAFT, OPEN, CLOSED.
availabilityenumWhether it takes orders today (status and dates). One of DRAFT, NOT_OPEN_YET, OPEN, CLOSED.
opensOnstring or null
closesOnstring or nullThe order deadline (inclusive), YYYY-MM-DD.
daysLeftinteger or null
customerIdstring or null
customerobject or null
customer.idstring
customer.namestring
customer.taxExemptboolean
themeobjectThe website theme: primaryColor and accentColor (#rrggbb), font (modern, classic, friendly, bold, elegant, geometric), radius (square, soft, round), headerStyle (light, dark, brand).
theme.primaryColorstring
theme.accentColorstring
theme.fontstring
theme.radiusstring
theme.headerStylestring
logoUrlstring or null
heroImageUrlstring or null
heroTitlestring or null
heroTextstring or null
accessenumWho may enter: PUBLIC, PASSWORD (a shared password), EMAIL_DOMAIN (an email at one of allowedEmailDomains, not verified) or INVITE (each person's own invite link). One of PUBLIC, PASSWORD, EMAIL_DOMAIN, INVITE.
hasPasswordbooleanA password is set (it is never returned).
allowedEmailDomainsarray of string
checkoutModeenumPAY_ONLINE (shoppers pay by card on Stripe Checkout, on the business's connected account), INVOICE_ACCOUNT (the store's customer is invoiced; orders wait for approval) or FREE (the customer pays; each person spends from allowanceCents). One of PAY_ONLINE, INVOICE_ACCOUNT, FREE.
requireApprovalboolean
allowanceCentsinteger or null
fundraiserGoalCentsinteger or null
fundraiserPercentnumber or null
shippingOptionsarray of objectUp to 10 items.
shippingOptions[].idstring
shippingOptions[].kindenumOne of SHIP, BULK, PICKUP.
shippingOptions[].labelstringUp to 80 characters.
shippingOptions[].rateenumOne of FREE, FLAT, TABLE.
shippingOptions[].flatCentsinteger0–1000000. Default 0.
shippingOptions[].tablearray of objectUp to 10 items. Default [].
shippingOptions[].table[].minSubtotalCentsinteger0–100000000.
shippingOptions[].table[].centsinteger0–1000000.
shippingOptions[].notestringUp to 500 characters. Default ``.
taxRatenumber
taxByAddressbooleanShipped orders are taxed by the business's tax rules for the address.
priceModeenumCATALOG (the catalog price + decoration), MARKUP (the catalog price raised by markupPercent + decoration) or FIXED (fixedPriceCents, all in). Size upcharges add on; CATALOG and MARKUP round up to .99 when roundTo99. One of CATALOG, MARKUP, FIXED.
markupPercentnumber or null
roundTo99boolean
policiesobjectThe policy pages as shoppers see them (the store's own words, else the default).
policies.returnsstring
policies.guaranteestring
policies.privacystring
returnsPolicystring or null
guaranteePolicystring or null
privacyPolicystring or null
contactEmailstring or null
contactPhonestring or null
fulfilledBystring or null
categoriesarray of object
categories[].idstring
categories[].namestring
categories[].slugstring
categories[].imageUrlstring or null
categories[].sortOrderinteger
productCountinteger
inviteCountinteger
orderCountintegerPaid or approved orders.
salesCentsintegerTotals of paid or approved orders.
fundraiserobject or null
fundraiser.raisedCentsintegerInteger cents.
fundraiser.goalCentsinteger or null
fundraiser.percentnumber or nullShare of the goal raised (may pass 100).
readinessarray of stringWhat must be fixed before the store can open (empty = ready).
urlsobject
urls.pathstringOn the app: /store/{subdomain} (always works).
urls.appUrlstring
urls.defaultUrlstring or nullhttps://{subdomain}.{sites domain} when the sites domain is configured.
urls.customUrlstring or nullhttps://{custom domain} when the store has an ACTIVE custom domain (shopper links use it).
publishedAtstring (date-time) or null
closedAtstring (date-time) or null
createdAtstring (date-time)
updatedAtstring (date-time)

Close a store

POST /organizations/{organizationId}/stores/{storeId}/close

Stops orders and makes its production batch final: answers the store and the batch (units per product, colour and size over paid and approved orders, the personalised lines to print and how orders are delivered) — the production and blank purchase list. The storefront stays up saying it is closed. POST /publish reopens it.

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

Parameters

NameInTypeRequiredDescription
storeIdpathstringYesThe store (GET /stores).

Example

curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/stores/{storeId}/close" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY"

Response

200: the answer's fields
FieldTypeDescription
storeobject
store.idstring
store.namestring
store.slugstring
store.subdomainstringIts address on the sites domain (unique across stores and websites).
store.kindenumCOMPANY (a company's branded store), TEAM (players and parents order by a deadline), FUNDRAISER (part of each sale goes to a cause, with a goal) or RETAIL (the business's own shop). One of COMPANY, TEAM, FUNDRAISER, RETAIL.
store.statusenumDRAFT (being built), OPEN (taking orders between its dates) or CLOSED. One of DRAFT, OPEN, CLOSED.
store.availabilityenumWhether it takes orders today (status and dates). One of DRAFT, NOT_OPEN_YET, OPEN, CLOSED.
store.opensOnstring or null
store.closesOnstring or nullThe order deadline (inclusive), YYYY-MM-DD.
store.daysLeftinteger or null
store.customerIdstring or null
store.customerobject or null
store.customer.idstring
store.customer.namestring
store.customer.taxExemptboolean
store.themeobjectThe website theme: primaryColor and accentColor (#rrggbb), font (modern, classic, friendly, bold, elegant, geometric), radius (square, soft, round), headerStyle (light, dark, brand).
store.theme.primaryColorstring
store.theme.accentColorstring
store.theme.fontstring
store.theme.radiusstring
store.theme.headerStylestring
store.logoUrlstring or null
store.heroImageUrlstring or null
store.heroTitlestring or null
store.heroTextstring or null
store.accessenumWho may enter: PUBLIC, PASSWORD (a shared password), EMAIL_DOMAIN (an email at one of allowedEmailDomains, not verified) or INVITE (each person's own invite link). One of PUBLIC, PASSWORD, EMAIL_DOMAIN, INVITE.
store.hasPasswordbooleanA password is set (it is never returned).
store.allowedEmailDomainsarray of string
store.checkoutModeenumPAY_ONLINE (shoppers pay by card on Stripe Checkout, on the business's connected account), INVOICE_ACCOUNT (the store's customer is invoiced; orders wait for approval) or FREE (the customer pays; each person spends from allowanceCents). One of PAY_ONLINE, INVOICE_ACCOUNT, FREE.
store.requireApprovalboolean
store.allowanceCentsinteger or null
store.fundraiserGoalCentsinteger or null
store.fundraiserPercentnumber or null
store.shippingOptionsarray of objectUp to 10 items.
store.shippingOptions[].idstring
store.shippingOptions[].kindenumOne of SHIP, BULK, PICKUP.
store.shippingOptions[].labelstringUp to 80 characters.
store.shippingOptions[].rateenumOne of FREE, FLAT, TABLE.
store.shippingOptions[].flatCentsinteger0–1000000. Default 0.
store.shippingOptions[].tablearray of objectUp to 10 items. Default [].
store.shippingOptions[].notestringUp to 500 characters. Default ``.
store.taxRatenumber
store.taxByAddressbooleanShipped orders are taxed by the business's tax rules for the address.
store.priceModeenumCATALOG (the catalog price + decoration), MARKUP (the catalog price raised by markupPercent + decoration) or FIXED (fixedPriceCents, all in). Size upcharges add on; CATALOG and MARKUP round up to .99 when roundTo99. One of CATALOG, MARKUP, FIXED.
store.markupPercentnumber or null
store.roundTo99boolean
store.policiesobjectThe policy pages as shoppers see them (the store's own words, else the default).
store.policies.returnsstring
store.policies.guaranteestring
store.policies.privacystring
store.returnsPolicystring or null
store.guaranteePolicystring or null
store.privacyPolicystring or null
store.contactEmailstring or null
store.contactPhonestring or null
store.fulfilledBystring or null
store.categoriesarray of object
store.categories[].idstring
store.categories[].namestring
store.categories[].slugstring
store.categories[].imageUrlstring or null
store.categories[].sortOrderinteger
store.productCountinteger
store.inviteCountinteger
store.orderCountintegerPaid or approved orders.
store.salesCentsintegerTotals of paid or approved orders.
store.fundraiserobject or null
store.fundraiser.raisedCentsintegerInteger cents.
store.fundraiser.goalCentsinteger or null
store.fundraiser.percentnumber or nullShare of the goal raised (may pass 100).
store.readinessarray of stringWhat must be fixed before the store can open (empty = ready).
store.urlsobject
store.urls.pathstringOn the app: /store/{subdomain} (always works).
store.urls.appUrlstring
store.urls.defaultUrlstring or nullhttps://{subdomain}.{sites domain} when the sites domain is configured.
store.urls.customUrlstring or nullhttps://{custom domain} when the store has an ACTIVE custom domain (shopper links use it).
store.publishedAtstring (date-time) or null
store.closedAtstring (date-time) or null
store.createdAtstring (date-time)
store.updatedAtstring (date-time)
batchobject

Set a store's categories

POST /organizations/{organizationId}/stores/{storeId}/categories

Replaces the store's category tiles with this ordered list (keep an existing one by its id; a missing one is removed and its products lose their category). Up to 30.

Permissionstores.manage (Owner, Admin, Staff)
Riskwrite, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it.
MCP toolstores_setCategories (toolset stores)
PlanOnline stores: the Grow plan and up.

Parameters

NameInTypeRequiredDescription
storeIdpathstringYesThe store (GET /stores).

Request body

FieldTypeRequiredDescription
categoriesarray of objectYesUp to 30 items.
categories[].idstring or nullNoAn existing category (from the store) to keep.
categories[].namestringYesUp to 60 characters.
categories[].imageUrlstring or nullNoAn image from POST /stores/images (/image-proxy/avatars/store-…) or an https URL. Up to 2000 characters.

Example

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

Response

200: the answer's fields
FieldTypeDescription
idstring
namestring
slugstring
subdomainstringIts address on the sites domain (unique across stores and websites).
kindenumCOMPANY (a company's branded store), TEAM (players and parents order by a deadline), FUNDRAISER (part of each sale goes to a cause, with a goal) or RETAIL (the business's own shop). One of COMPANY, TEAM, FUNDRAISER, RETAIL.
statusenumDRAFT (being built), OPEN (taking orders between its dates) or CLOSED. One of DRAFT, OPEN, CLOSED.
availabilityenumWhether it takes orders today (status and dates). One of DRAFT, NOT_OPEN_YET, OPEN, CLOSED.
opensOnstring or null
closesOnstring or nullThe order deadline (inclusive), YYYY-MM-DD.
daysLeftinteger or null
customerIdstring or null
customerobject or null
customer.idstring
customer.namestring
customer.taxExemptboolean
themeobjectThe website theme: primaryColor and accentColor (#rrggbb), font (modern, classic, friendly, bold, elegant, geometric), radius (square, soft, round), headerStyle (light, dark, brand).
theme.primaryColorstring
theme.accentColorstring
theme.fontstring
theme.radiusstring
theme.headerStylestring
logoUrlstring or null
heroImageUrlstring or null
heroTitlestring or null
heroTextstring or null
accessenumWho may enter: PUBLIC, PASSWORD (a shared password), EMAIL_DOMAIN (an email at one of allowedEmailDomains, not verified) or INVITE (each person's own invite link). One of PUBLIC, PASSWORD, EMAIL_DOMAIN, INVITE.
hasPasswordbooleanA password is set (it is never returned).
allowedEmailDomainsarray of string
checkoutModeenumPAY_ONLINE (shoppers pay by card on Stripe Checkout, on the business's connected account), INVOICE_ACCOUNT (the store's customer is invoiced; orders wait for approval) or FREE (the customer pays; each person spends from allowanceCents). One of PAY_ONLINE, INVOICE_ACCOUNT, FREE.
requireApprovalboolean
allowanceCentsinteger or null
fundraiserGoalCentsinteger or null
fundraiserPercentnumber or null
shippingOptionsarray of objectUp to 10 items.
shippingOptions[].idstring
shippingOptions[].kindenumOne of SHIP, BULK, PICKUP.
shippingOptions[].labelstringUp to 80 characters.
shippingOptions[].rateenumOne of FREE, FLAT, TABLE.
shippingOptions[].flatCentsinteger0–1000000. Default 0.
shippingOptions[].tablearray of objectUp to 10 items. Default [].
shippingOptions[].table[].minSubtotalCentsinteger0–100000000.
shippingOptions[].table[].centsinteger0–1000000.
shippingOptions[].notestringUp to 500 characters. Default ``.
taxRatenumber
taxByAddressbooleanShipped orders are taxed by the business's tax rules for the address.
priceModeenumCATALOG (the catalog price + decoration), MARKUP (the catalog price raised by markupPercent + decoration) or FIXED (fixedPriceCents, all in). Size upcharges add on; CATALOG and MARKUP round up to .99 when roundTo99. One of CATALOG, MARKUP, FIXED.
markupPercentnumber or null
roundTo99boolean
policiesobjectThe policy pages as shoppers see them (the store's own words, else the default).
policies.returnsstring
policies.guaranteestring
policies.privacystring
returnsPolicystring or null
guaranteePolicystring or null
privacyPolicystring or null
contactEmailstring or null
contactPhonestring or null
fulfilledBystring or null
categoriesarray of object
categories[].idstring
categories[].namestring
categories[].slugstring
categories[].imageUrlstring or null
categories[].sortOrderinteger
productCountinteger
inviteCountinteger
orderCountintegerPaid or approved orders.
salesCentsintegerTotals of paid or approved orders.
fundraiserobject or null
fundraiser.raisedCentsintegerInteger cents.
fundraiser.goalCentsinteger or null
fundraiser.percentnumber or nullShare of the goal raised (may pass 100).
readinessarray of stringWhat must be fixed before the store can open (empty = ready).
urlsobject
urls.pathstringOn the app: /store/{subdomain} (always works).
urls.appUrlstring
urls.defaultUrlstring or nullhttps://{subdomain}.{sites domain} when the sites domain is configured.
urls.customUrlstring or nullhttps://{custom domain} when the store has an ACTIVE custom domain (shopper links use it).
publishedAtstring (date-time) or null
closedAtstring (date-time) or null
createdAtstring (date-time)
updatedAtstring (date-time)

A store's sales

GET /organizations/{organizationId}/stores/{storeId}/dashboard

Orders by status, paid/approved orders, sales, units sold, average order, fundraiser progress, the top five products and the latest orders. Read-only.

Permissionstores.read (Owner, Admin, Staff, Member)
Riskread, OAuth scope skuflow.read. Read: reads only.
MCP toolstores_dashboard (toolset stores)

Parameters

NameInTypeRequiredDescription
storeIdpathstringYesThe store (GET /stores).

Example

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

Response

200: the answer's fields
FieldTypeDescription
storeIdstring
ordersByStatusobject
orderCountinteger
salesCentsintegerInteger cents.
unitsSoldinteger
averageOrderCentsintegerInteger cents.
fundraiserobject or null
fundraiser.raisedCentsintegerInteger cents.
fundraiser.goalCentsinteger or null
fundraiser.percentnumber or nullShare of the goal raised (may pass 100).
topProductsarray of object
topProducts[].productNamestring
topProducts[].unitsinteger
topProducts[].salesCentsintegerInteger cents.
recentOrdersarray of object
recentOrders[].idstring
recentOrders[].identifierstring
recentOrders[].statusenumPENDING_PAYMENT (waiting for Stripe Checkout), AWAITING_APPROVAL (company-paid), PLACED (paid or approved: in the batch), FULFILLED, REJECTED or CANCELLED. One of PENDING_PAYMENT, AWAITING_APPROVAL, PLACED, FULFILLED, REJECTED, CANCELLED.
recentOrders[].buyerNamestring
recentOrders[].totalCentsintegerInteger cents.
recentOrders[].createdAtstring (date-time)

A store's production batch

GET /organizations/{organizationId}/stores/{storeId}/batch

The group order so far (final once the store is closed): units per product (with its decoration and design), colour and size over paid and approved orders — what to produce and which blanks to buy — plus the personalised lines (names, numbers) to print and the delivery methods. Read-only.

Permissionstores.read (Owner, Admin, Staff, Member)
Riskread, OAuth scope skuflow.read. Read: reads only.
MCP toolstores_batch (toolset stores)

Parameters

NameInTypeRequiredDescription
storeIdpathstringYesThe store (GET /stores).

Example

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

Response

200: the answer's fields
FieldTypeDescription
storeIdstring
orderCountinteger
totalUnitsinteger
productsarray of object
products[].productIdstring or null
products[].productNamestring
products[].styleNumberstring or null
products[].decorationNamestring or null
products[].designIdstring or null
products[].totalUnitsinteger
products[].sizesarray of string
products[].colorsarray of object
products[].colors[].colorNamestring or null
products[].colors[].totalUnitsinteger
products[].colors[].sizesarray of object
personalizedarray of object
personalized[].orderIdentifierstring
personalized[].buyerNamestring
personalized[].productNamestring
personalized[].colorNamestring or null
personalized[].sizestring or null
personalized[].quantityinteger
personalized[].valuesstring
shippingarray of object
shipping[].labelstring
shipping[].kindstring
shipping[].ordersinteger

Export a store's orders (CSV)

GET /organizations/{organizationId}/stores/{storeId}/orders/export

Every order line of the store as CSV text (order, date, status, name, email, delivery, address, cost centre, product, SKU, colour, size, personalisation, quantity, prices), optionally one status only. Spreadsheet formulas are neutralised. Read-only.

Permissionstores.read (Owner, Admin, Staff, Member)
Riskread, OAuth scope skuflow.read. Read: reads only.
MCP toolstores_exportOrders (toolset stores)

Parameters

NameInTypeRequiredDescription
storeIdpathstringYesThe store (GET /stores).
statusqueryenumNoPENDING_PAYMENT (waiting for Stripe Checkout), AWAITING_APPROVAL (company-paid), PLACED (paid or approved: in the batch), FULFILLED, REJECTED or CANCELLED. One of PENDING_PAYMENT, AWAITING_APPROVAL, PLACED, FULFILLED, REJECTED, CANCELLED.

Example

curl "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/stores/{storeId}/orders/export" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY"

Response

200: the answer's fields
FieldTypeDescription
filenamestring
contentTypestring
orderCountinteger
csvstring

Draft a store's banner and categories

POST /organizations/{organizationId}/stores/draft

Suggests a store name, banner title and text, category tiles and an address from the business's name, the customer's (optional) and the products chosen. Written by Claude when configured (uses AI credits), else a template; never invents facts (no prices, deadlines or promises). Creates nothing: pass the result to POST /stores.

Permissionstores.manage (Owner, Admin, Staff)
Riskwrite, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it.
MCP toolstores_draft (toolset stores)
PlanOnline stores: the Grow plan and up.

Request body

FieldTypeRequiredDescription
kindenumYesCOMPANY (a company's branded store), TEAM (players and parents order by a deadline), FUNDRAISER (part of each sale goes to a cause, with a goal) or RETAIL (the business's own shop). One of COMPANY, TEAM, FUNDRAISER, RETAIL.
namestring or nullNoUp to 200 characters.
customerIdstring or nullNoThe customer the store is for.
productIdsarray of stringNoUp to 300 items.

Example

curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/stores/draft" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"kind":"COMPANY"}'

Response

200: the answer's fields
FieldTypeDescription
namestring
heroTitlestring
heroTextstring
categoriesarray of string
sourceenumOne of AI, TEMPLATE.
suggestedSubdomainstring

Upload a store picture

POST /organizations/{organizationId}/stores/images

Stores a picture in one call — contentBase64 (JPEG, PNG, WebP or GIF, up to 8 MB) or a public sourceUrl SKUFlow downloads through its SSRF guard — and answers its url for a store's logo, banner, category tile or a product's decorated mockup (PATCH /stores/{storeId}/products/{storeProductId} mockups).

Permissionstores.manage (Owner, Admin, Staff)
Riskwrite, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it.
MCP toolstores_uploadImage (toolset stores)
PlanOnline stores: the Grow plan and up.

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.

Example

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

Response

201: the answer's fields
FieldTypeDescription
urlstring
contentTypestring

A store's invites

GET /organizations/{organizationId}/stores/{storeId}/invites

The people invited to an INVITE store, each with their own link (their key to the store) and when it was last used. Read-only.

Permissionstores.read (Owner, Admin, Staff, Member)
Riskread, OAuth scope skuflow.read. Read: reads only.
MCP toolstores_invites (toolset stores)

Parameters

NameInTypeRequiredDescription
storeIdpathstringYesThe store (GET /stores).

Example

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

Response

200: the answer's fields
FieldTypeDescription
itemsarray of object
items[].idstring
items[].emailstring
items[].namestring or null
items[].urlstring
items[].lastUsedAtstring (date-time) or null
items[].createdAtstring (date-time)

Invite people to a store

POST /organizations/{organizationId}/stores/{storeId}/invites

Grants access: gives each email its own invite link to the store (people already invited keep theirs). SKUFlow does not email the links: share them (the answer lists every invite with its url).

Permissionstores.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 toolstores_addInvites (toolset stores)
PlanOnline stores: the Grow plan and up.
ApprovalOver MCP, this tool always waits for your approval in SKUFlow. See Approvals.

Parameters

NameInTypeRequiredDescription
storeIdpathstringYesThe store (GET /stores).

Request body

FieldTypeRequiredDescription
peoplearray of objectYesUp to 500 items.
people[].emailstring (email)YesUp to 254 characters.
people[].namestring or nullNoUp to 200 characters.

Example

curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/stores/{storeId}/invites" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"people":[{"email":"dana@example.com"}]}'

Response

200: the answer's fields
FieldTypeDescription
itemsarray of object
items[].idstring
items[].emailstring
items[].namestring or null
items[].urlstring
items[].lastUsedAtstring (date-time) or null
items[].createdAtstring (date-time)

A store's custom domains

GET /organizations/{organizationId}/stores/{storeId}/domains

The store's own domains (e.g. shop.example.com) with their status and every DNS record to add. Read-only.

Permissionstores.read (Owner, Admin, Staff, Member)
Riskread, OAuth scope skuflow.read. Read: reads only.
MCP toolstores_domains (toolset stores)

Parameters

NameInTypeRequiredDescription
storeIdpathstringYesThe store (GET /stores).

Example

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

Response

200: the answer's fields
FieldTypeDescription
storeIdstring
urlsobject
urls.pathstringOn the app: /store/{subdomain} (always works).
urls.appUrlstring
urls.defaultUrlstring or nullhttps://{subdomain}.{sites domain} when the sites domain is configured.
urls.customUrlstring or nullhttps://{custom domain} when the store has an ACTIVE custom domain (shopper links use it).
itemsarray of object
items[].idstring
items[].hostnamestring
items[].statusenumACTIVE domains serve the store; PENDING waits for DNS; FAILED after three days. One of PENDING, ACTIVE, FAILED.
items[].isPrimarybooleanThe address shopper links use once it is ACTIVE.
items[].lastErrorstring or nullWhat the last DNS check found missing.
items[].apexbooleanA bare domain (example.com): A records instead of a CNAME.
items[].cnameTargetstringWhere a CNAME points (SKUFlow's sites host).
items[].recordsarray of objectEvery DNS record to add at the domain's DNS host.
items[].records[].typestring
items[].records[].namestringRelative to the domain, as most DNS providers ask.
items[].records[].fullNamestring
items[].records[].valuestring

Connect a custom domain to a store

POST /organizations/{organizationId}/stores/{storeId}/domains

Adds a domain (e.g. shop.example.com) as PENDING. The business adds every record in records (the ownership TXT and a CNAME, or A records for a bare domain); the domain becomes ACTIVE once the checks pass (every ten minutes, or POST …/verify), then serves the storefront and becomes the address in shopper links and emails. Up to three per store; a domain can't belong to a website and a store at once.

Permissionstores.manage (Owner, Admin, Staff)
Riskwrite, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it.
MCP toolstores_addDomain (toolset stores)
PlanCustom domain: the Grow plan and up.

Parameters

NameInTypeRequiredDescription
storeIdpathstringYesThe store (GET /stores).

Request body

FieldTypeRequiredDescription
hostnamestringYesUp to 260 characters.

Example

curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/stores/{storeId}/domains" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"hostname":"string"}'

Response

201: the answer's fields
FieldTypeDescription
storeIdstring
urlsobject
urls.pathstringOn the app: /store/{subdomain} (always works).
urls.appUrlstring
urls.defaultUrlstring or nullhttps://{subdomain}.{sites domain} when the sites domain is configured.
urls.customUrlstring or nullhttps://{custom domain} when the store has an ACTIVE custom domain (shopper links use it).
itemsarray of object
items[].idstring
items[].hostnamestring
items[].statusenumACTIVE domains serve the store; PENDING waits for DNS; FAILED after three days. One of PENDING, ACTIVE, FAILED.
items[].isPrimarybooleanThe address shopper links use once it is ACTIVE.
items[].lastErrorstring or nullWhat the last DNS check found missing.
items[].apexbooleanA bare domain (example.com): A records instead of a CNAME.
items[].cnameTargetstringWhere a CNAME points (SKUFlow's sites host).
items[].recordsarray of objectEvery DNS record to add at the domain's DNS host.
items[].records[].typestring
items[].records[].namestringRelative to the domain, as most DNS providers ask.
items[].records[].fullNamestring
items[].records[].valuestring

Check a store domain's DNS now

POST /organizations/{organizationId}/stores/{storeId}/domains/{domainId}/verify

Runs the DNS checks for one store domain now; lastError says what is missing. ACTIVE domains serve the store.

Permissionstores.manage (Owner, Admin, Staff)
Riskwrite, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it.
MCP toolstores_verifyDomain (toolset stores)
PlanCustom domain: the Grow plan and up.

Parameters

NameInTypeRequiredDescription
storeIdpathstringYesThe store (GET /stores).
domainIdpathstringYesThe custom domain (GET /stores/{storeId}/domains).

Example

curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/stores/{storeId}/domains/{domainId}/verify" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY"

Response

200: the answer's fields
FieldTypeDescription
storeIdstring
urlsobject
urls.pathstringOn the app: /store/{subdomain} (always works).
urls.appUrlstring
urls.defaultUrlstring or nullhttps://{subdomain}.{sites domain} when the sites domain is configured.
urls.customUrlstring or nullhttps://{custom domain} when the store has an ACTIVE custom domain (shopper links use it).
itemsarray of object
items[].idstring
items[].hostnamestring
items[].statusenumACTIVE domains serve the store; PENDING waits for DNS; FAILED after three days. One of PENDING, ACTIVE, FAILED.
items[].isPrimarybooleanThe address shopper links use once it is ACTIVE.
items[].lastErrorstring or nullWhat the last DNS check found missing.
items[].apexbooleanA bare domain (example.com): A records instead of a CNAME.
items[].cnameTargetstringWhere a CNAME points (SKUFlow's sites host).
items[].recordsarray of objectEvery DNS record to add at the domain's DNS host.
items[].records[].typestring
items[].records[].namestringRelative to the domain, as most DNS providers ask.
items[].records[].fullNamestring
items[].records[].valuestring

Make a domain the store's main address

POST /organizations/{organizationId}/stores/{storeId}/domains/{domainId}/primary

Shopper links (invites, order confirmations, checkout returns) use this domain once it is ACTIVE.

Permissionstores.manage (Owner, Admin, Staff)
Riskwrite, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it.
MCP toolstores_setPrimaryDomain (toolset stores)
PlanCustom domain: the Grow plan and up.

Parameters

NameInTypeRequiredDescription
storeIdpathstringYesThe store (GET /stores).
domainIdpathstringYesThe custom domain (GET /stores/{storeId}/domains).

Example

curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/stores/{storeId}/domains/{domainId}/primary" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY"

Response

200: the answer's fields
FieldTypeDescription
storeIdstring
urlsobject
urls.pathstringOn the app: /store/{subdomain} (always works).
urls.appUrlstring
urls.defaultUrlstring or nullhttps://{subdomain}.{sites domain} when the sites domain is configured.
urls.customUrlstring or nullhttps://{custom domain} when the store has an ACTIVE custom domain (shopper links use it).
itemsarray of object
items[].idstring
items[].hostnamestring
items[].statusenumACTIVE domains serve the store; PENDING waits for DNS; FAILED after three days. One of PENDING, ACTIVE, FAILED.
items[].isPrimarybooleanThe address shopper links use once it is ACTIVE.
items[].lastErrorstring or nullWhat the last DNS check found missing.
items[].apexbooleanA bare domain (example.com): A records instead of a CNAME.
items[].cnameTargetstringWhere a CNAME points (SKUFlow's sites host).
items[].recordsarray of objectEvery DNS record to add at the domain's DNS host.
items[].records[].typestring
items[].records[].namestringRelative to the domain, as most DNS providers ask.
items[].records[].fullNamestring
items[].records[].valuestring

Disconnect a store domain

DELETE /organizations/{organizationId}/stores/{storeId}/domains/{domainId}

Destructive: the domain stops serving the store at once; links already sent with it stop working (the store stays at its SKUFlow address).

Permissionstores.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 toolstores_removeDomain (toolset stores)
ApprovalOver MCP, this tool always waits for your approval in SKUFlow. See Approvals.

Parameters

NameInTypeRequiredDescription
storeIdpathstringYesThe store (GET /stores).
domainIdpathstringYesThe custom domain (GET /stores/{storeId}/domains).

Example

curl -X DELETE "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/stores/{storeId}/domains/{domainId}" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY"

Response

200: the answer's fields
FieldTypeDescription
storeIdstring
urlsobject
urls.pathstringOn the app: /store/{subdomain} (always works).
urls.appUrlstring
urls.defaultUrlstring or nullhttps://{subdomain}.{sites domain} when the sites domain is configured.
urls.customUrlstring or nullhttps://{custom domain} when the store has an ACTIVE custom domain (shopper links use it).
itemsarray of object
items[].idstring
items[].hostnamestring
items[].statusenumACTIVE domains serve the store; PENDING waits for DNS; FAILED after three days. One of PENDING, ACTIVE, FAILED.
items[].isPrimarybooleanThe address shopper links use once it is ACTIVE.
items[].lastErrorstring or nullWhat the last DNS check found missing.
items[].apexbooleanA bare domain (example.com): A records instead of a CNAME.
items[].cnameTargetstringWhere a CNAME points (SKUFlow's sites host).
items[].recordsarray of objectEvery DNS record to add at the domain's DNS host.
items[].records[].typestring
items[].records[].namestringRelative to the domain, as most DNS providers ask.
items[].records[].fullNamestring
items[].records[].valuestring

Remove an invite

DELETE /organizations/{organizationId}/stores/{storeId}/invites/{inviteId}

Revokes access: the person's link stops working and their shopper session must pass the gate again.

Permissionstores.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 toolstores_deleteInvite (toolset stores)
ApprovalOver MCP, this tool always waits for your approval in SKUFlow. See Approvals.

Parameters

NameInTypeRequiredDescription
storeIdpathstringYesThe store (GET /stores).
inviteIdpathstringYes

Example

curl -X DELETE "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/stores/{storeId}/invites/{inviteId}" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY"

Response

200: the answer's fields
FieldTypeDescription
deletedtrue

A store's products

GET /organizations/{organizationId}/stores/{storeId}/products

The catalog products sold in a store with the colours and sizes offered, the store price range, decoration, mockups and personalisation fields. Read-only.

Permissionstores.read (Owner, Admin, Staff, Member)
Riskread, OAuth scope skuflow.read. Read: reads only.
MCP toolstoreProducts_list (toolset stores)

Parameters

NameInTypeRequiredDescription
storeIdpathstringYesThe store (GET /stores).

Example

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

Response

200: the answer's fields
FieldTypeDescription
itemsarray of object
items[].idstring
items[].storeIdstring
items[].productIdstring
items[].categoryIdstring or null
items[].categoryobject or null
items[].category.idstring
items[].category.namestring
items[].displayNamestring
items[].namestring or null
items[].descriptionstring or null
items[].sortOrderinteger
items[].activeboolean
items[].colorsarray of stringColours offered; empty = every active colour.
items[].sizesarray of stringSizes offered; empty = every size.
items[].priceModeenum or nullNull follows the store's pricing. One of CATALOG, MARKUP, FIXED.
items[].markupPercentnumber or null
items[].fixedPriceCentsinteger or null
items[].sizeUpchargeCentsobject
items[].roundTo99boolean or null
items[].designIdstring or nullThe decoration design of this product (GET /designs/{designId}); its rendered mockups show after uploaded ones.
items[].decorationNamestring or null
items[].decorationPriceCentsintegerInteger cents.
items[].mockupsarray of object
items[].mockups[].idstringUp to 40 characters.
items[].mockups[].colorNamestring or nullUp to 200 characters.
items[].mockups[].viewenumOne of FRONT, BACK, SIDE, DETAIL, OTHER.
items[].mockups[].urlstringUp to 2000 characters.
items[].personalizationarray of objectUp to 5 items.
items[].personalization[].keystring
items[].personalization[].labelstringUp to 60 characters.
items[].personalization[].kindenumOne of TEXT, NUMBER.
items[].personalization[].maxLengthinteger1–40. Default 12.
items[].personalization[].priceCentsinteger0–100000. Default 0.
items[].personalization[].requiredbooleanDefault false.
items[].productobject
items[].product.idstring
items[].product.namestring
items[].product.slugstring
items[].product.imagestring or null
items[].product.availableColorsarray of object
items[].product.availableSizesarray of string
items[].variantCountinteger
items[].priceFromCentsinteger or nullThe lowest store price offered.
items[].priceToCentsinteger or null

Add products to a store

POST /organizations/{organizationId}/stores/{storeId}/products

Adds catalog products (GET /products; active ones) to the store, into categoryId or, by default, the category each product's kind and name suggest (made when missing). Products already in the store are skipped. Prices follow the store's pricing until PATCHed. Up to 300 per store.

Permissionstores.manage (Owner, Admin, Staff)
Riskwrite, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it.
MCP toolstoreProducts_add (toolset stores)
PlanOnline stores: the Grow plan and up.

Parameters

NameInTypeRequiredDescription
storeIdpathstringYesThe store (GET /stores).

Request body

FieldTypeRequiredDescription
productIdsarray of stringYesUp to 300 items.
categoryIdstring or nullNoA category of this store.
autoCategorybooleanNoPut each product in its suggested category (default true).

Example

curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/stores/{storeId}/products" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"productIds":["product_id"]}'

Response

201: the answer's fields
FieldTypeDescription
addedinteger
itemsarray of object
items[].idstring
items[].storeIdstring
items[].productIdstring
items[].categoryIdstring or null
items[].categoryobject or null
items[].category.idstring
items[].category.namestring
items[].displayNamestring
items[].namestring or null
items[].descriptionstring or null
items[].sortOrderinteger
items[].activeboolean
items[].colorsarray of stringColours offered; empty = every active colour.
items[].sizesarray of stringSizes offered; empty = every size.
items[].priceModeenum or nullNull follows the store's pricing. One of CATALOG, MARKUP, FIXED.
items[].markupPercentnumber or null
items[].fixedPriceCentsinteger or null
items[].sizeUpchargeCentsobject
items[].roundTo99boolean or null
items[].designIdstring or nullThe decoration design of this product (GET /designs/{designId}); its rendered mockups show after uploaded ones.
items[].decorationNamestring or null
items[].decorationPriceCentsintegerInteger cents.
items[].mockupsarray of object
items[].mockups[].idstringUp to 40 characters.
items[].mockups[].colorNamestring or nullUp to 200 characters.
items[].mockups[].viewenumOne of FRONT, BACK, SIDE, DETAIL, OTHER.
items[].mockups[].urlstringUp to 2000 characters.
items[].personalizationarray of objectUp to 5 items.
items[].personalization[].keystring
items[].personalization[].labelstringUp to 60 characters.
items[].personalization[].kindenumOne of TEXT, NUMBER.
items[].personalization[].maxLengthinteger1–40. Default 12.
items[].personalization[].priceCentsinteger0–100000. Default 0.
items[].personalization[].requiredbooleanDefault false.
items[].productobject
items[].product.idstring
items[].product.namestring
items[].product.slugstring
items[].product.imagestring or null
items[].product.availableColorsarray of object
items[].product.availableSizesarray of string
items[].variantCountinteger
items[].priceFromCentsinteger or nullThe lowest store price offered.
items[].priceToCentsinteger or null

Change a store product

PATCH /organizations/{organizationId}/stores/{storeId}/products/{storeProductId}

Changes the fields sent: category, display name and text, order, on or off, colours and sizes offered, pricing (priceMode, markupPercent, fixedPriceCents, size upcharges, roundTo99), decoration (name, per-unit price, designId), decorated mockups per colour and view (pictures from POST /stores/images) and personalisation fields (e.g. name and number, each with its price).

Permissionstores.manage (Owner, Admin, Staff)
Riskwrite, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it.
MCP toolstoreProducts_update (toolset stores)
PlanOnline stores: the Grow plan and up.

Parameters

NameInTypeRequiredDescription
storeIdpathstringYesThe store (GET /stores).
storeProductIdpathstringYes

Request body

FieldTypeRequiredDescription
categoryIdstring or nullNo
namestring or nullNoUp to 200 characters.
descriptionstring or nullNoUp to 5000 characters.
sortOrderintegerNo0–100000.
activebooleanNo
colorsarray of stringNoUp to 100 items.
sizesarray of stringNoUp to 50 items.
priceModeenum or nullNoCATALOG (the catalog price + decoration), MARKUP (the catalog price raised by markupPercent + decoration) or FIXED (fixedPriceCents, all in). Size upcharges add on; CATALOG and MARKUP round up to .99 when roundTo99. One of CATALOG, MARKUP, FIXED.
markupPercentnumber or nullNo0–1000.
fixedPriceCentsinteger or nullNo0–100000000.
sizeUpchargeCentsobjectNo
roundTo99boolean or nullNo
designIdstring or nullNoA design of this product (GET /designs?productId=); its rendered mockups show in the store after uploaded ones. Null unlinks it. Up to 40 characters.
decorationNamestring or nullNoUp to 200 characters.
decorationPriceCentsintegerNo0–100000000.
mockupsarray of objectNoUp to 40 items.
mockups[].idstringYesUp to 40 characters.
mockups[].colorNamestring or nullYesUp to 200 characters.
mockups[].viewenumYesOne of FRONT, BACK, SIDE, DETAIL, OTHER.
mockups[].urlstringYesUp to 2000 characters.
personalizationarray of objectNoUp to 5 items.
personalization[].keystringYes
personalization[].labelstringYesUp to 60 characters.
personalization[].kindenumYesOne of TEXT, NUMBER.
personalization[].maxLengthintegerNo1–40. Default 12.
personalization[].priceCentsintegerNo0–100000. Default 0.
personalization[].requiredbooleanNoDefault false.

Example

curl -X PATCH "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/stores/{storeId}/products/{storeProductId}" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"categoryId":"category_id","name":"Dana Whitfield","description":"string"}'

Response

200: the answer's fields
FieldTypeDescription
idstring
storeIdstring
productIdstring
categoryIdstring or null
categoryobject or null
category.idstring
category.namestring
displayNamestring
namestring or null
descriptionstring or null
sortOrderinteger
activeboolean
colorsarray of stringColours offered; empty = every active colour.
sizesarray of stringSizes offered; empty = every size.
priceModeenum or nullNull follows the store's pricing. One of CATALOG, MARKUP, FIXED.
markupPercentnumber or null
fixedPriceCentsinteger or null
sizeUpchargeCentsobject
roundTo99boolean or null
designIdstring or nullThe decoration design of this product (GET /designs/{designId}); its rendered mockups show after uploaded ones.
decorationNamestring or null
decorationPriceCentsintegerInteger cents.
mockupsarray of object
mockups[].idstringUp to 40 characters.
mockups[].colorNamestring or nullUp to 200 characters.
mockups[].viewenumOne of FRONT, BACK, SIDE, DETAIL, OTHER.
mockups[].urlstringUp to 2000 characters.
personalizationarray of objectUp to 5 items.
personalization[].keystring
personalization[].labelstringUp to 60 characters.
personalization[].kindenumOne of TEXT, NUMBER.
personalization[].maxLengthinteger1–40. Default 12.
personalization[].priceCentsinteger0–100000. Default 0.
personalization[].requiredbooleanDefault false.
productobject
product.idstring
product.namestring
product.slugstring
product.imagestring or null
product.availableColorsarray of object
product.availableColors[].namestring
product.availableColors[].hexstring or null
product.availableSizesarray of string
variantCountinteger
priceFromCentsinteger or nullThe lowest store price offered.
priceToCentsinteger or null

Remove a product from a store

DELETE /organizations/{organizationId}/stores/{storeId}/products/{storeProductId}

Takes the product out of the store (the catalog product stays). Carts holding it show it as unavailable; past orders keep their snapshot.

Permissionstores.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 toolstoreProducts_remove (toolset stores)
ApprovalOver MCP, this tool always waits for your approval in SKUFlow. See Approvals.

Parameters

NameInTypeRequiredDescription
storeIdpathstringYesThe store (GET /stores).
storeProductIdpathstringYes

Example

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

Response

200: the answer's fields
FieldTypeDescription
deletedtrue

List store orders

GET /organizations/{organizationId}/store-orders

Orders from the business's online stores, newest first, with their lines (snapshots), totals and invoice. Filter by store and status; query searches the order number, name and email. Read-only.

Permissionstores.read (Owner, Admin, Staff, Member)
Riskread, OAuth scope skuflow.read. Read: reads only.
MCP toolstoreOrders_list (toolset stores)

Parameters

NameInTypeRequiredDescription
storeIdquerystringNo
statusqueryenumNoPENDING_PAYMENT (waiting for Stripe Checkout), AWAITING_APPROVAL (company-paid), PLACED (paid or approved: in the batch), FULFILLED, REJECTED or CANCELLED. One of PENDING_PAYMENT, AWAITING_APPROVAL, PLACED, FULFILLED, REJECTED, CANCELLED.
queryquerystringNoUp to 200 characters.
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/store-orders" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY"

Response

200: the answer's fields
FieldTypeDescription
totalinteger
itemsarray of object
items[].idstring
items[].identifierstringSO-n.
items[].storeIdstring
items[].storeobject
items[].store.idstring
items[].store.namestring
items[].statusenumPENDING_PAYMENT (waiting for Stripe Checkout), AWAITING_APPROVAL (company-paid), PLACED (paid or approved: in the batch), FULFILLED, REJECTED or CANCELLED. One of PENDING_PAYMENT, AWAITING_APPROVAL, PLACED, FULFILLED, REJECTED, CANCELLED.
items[].checkoutModeenumPAY_ONLINE (shoppers pay by card on Stripe Checkout, on the business's connected account), INVOICE_ACCOUNT (the store's customer is invoiced; orders wait for approval) or FREE (the customer pays; each person spends from allowanceCents). One of PAY_ONLINE, INVOICE_ACCOUNT, FREE.
items[].customerIdstring or nullWho is billed: the shopper (PAY_ONLINE) or the store's customer.
items[].invoiceIdstring or null
items[].invoiceobject or null
items[].invoice.idstring
items[].invoice.identifierstring
items[].invoice.statusstring
items[].buyerNamestring
items[].buyerEmailstring
items[].buyerPhonestring or null
items[].shippingMethodobject
items[].shippingMethod.idstring
items[].shippingMethod.kindstring
items[].shippingMethod.labelstring
items[].shippingAddressobject or null
items[].shippingAddress.namestring
items[].shippingAddress.line1string
items[].shippingAddress.line2string
items[].shippingAddress.citystring
items[].shippingAddress.statestring
items[].shippingAddress.postalCodestring
items[].shippingAddress.countrystring
items[].subtotalCentsintegerInteger cents.
items[].shippingCentsintegerInteger cents.
items[].taxCentsintegerInteger cents.
items[].totalCentsintegerInteger cents.
items[].allowanceCentsintegerInteger cents.
items[].raisedCentsintegerInteger cents.
items[].approverNamestring or null
items[].approverEmailstring or null
items[].costCenterstring or null
items[].poNumberstring or null
items[].notestring or null
items[].linesarray of object
items[].lines[].productNamestring
items[].lines[].colorNamestring or null
items[].lines[].sizestring or null
items[].lines[].quantityinteger
items[].lines[].unitPriceCentsintegerInteger cents.
items[].lines[].lineTotalCentsintegerInteger cents.
items[].lines[].personalizationarray of object
items[].orderUrlstringThe shopper's confirmation page.
items[].placedAtstring (date-time) or null
items[].createdAtstring (date-time)

A store order

GET /organizations/{organizationId}/store-orders/{storeOrderId}

One order with its lines, delivery, totals, approver and cost centre, and its invoice. Read-only.

Permissionstores.read (Owner, Admin, Staff, Member)
Riskread, OAuth scope skuflow.read. Read: reads only.
MCP toolstoreOrders_get (toolset stores)

Parameters

NameInTypeRequiredDescription
storeOrderIdpathstringYesThe store order (GET /store-orders).

Example

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

Response

200: the answer's fields
FieldTypeDescription
idstring
identifierstringSO-n.
storeIdstring
storeobject
store.idstring
store.namestring
statusenumPENDING_PAYMENT (waiting for Stripe Checkout), AWAITING_APPROVAL (company-paid), PLACED (paid or approved: in the batch), FULFILLED, REJECTED or CANCELLED. One of PENDING_PAYMENT, AWAITING_APPROVAL, PLACED, FULFILLED, REJECTED, CANCELLED.
checkoutModeenumPAY_ONLINE (shoppers pay by card on Stripe Checkout, on the business's connected account), INVOICE_ACCOUNT (the store's customer is invoiced; orders wait for approval) or FREE (the customer pays; each person spends from allowanceCents). One of PAY_ONLINE, INVOICE_ACCOUNT, FREE.
customerIdstring or nullWho is billed: the shopper (PAY_ONLINE) or the store's customer.
invoiceIdstring or null
invoiceobject or null
invoice.idstring
invoice.identifierstring
invoice.statusstring
buyerNamestring
buyerEmailstring
buyerPhonestring or null
shippingMethodobject
shippingMethod.idstring
shippingMethod.kindstring
shippingMethod.labelstring
shippingAddressobject or null
shippingAddress.namestring
shippingAddress.line1string
shippingAddress.line2string
shippingAddress.citystring
shippingAddress.statestring
shippingAddress.postalCodestring
shippingAddress.countrystring
subtotalCentsintegerInteger cents.
shippingCentsintegerInteger cents.
taxCentsintegerInteger cents.
totalCentsintegerInteger cents.
allowanceCentsintegerInteger cents.
raisedCentsintegerInteger cents.
approverNamestring or null
approverEmailstring or null
costCenterstring or null
poNumberstring or null
notestring or null
linesarray of object
lines[].productNamestring
lines[].colorNamestring or null
lines[].sizestring or null
lines[].quantityinteger
lines[].unitPriceCentsintegerInteger cents.
lines[].lineTotalCentsintegerInteger cents.
lines[].personalizationarray of object
lines[].personalization[].keystring
lines[].personalization[].labelstring
lines[].personalization[].valuestring
orderUrlstringThe shopper's confirmation page.
placedAtstring (date-time) or null
createdAtstring (date-time)

Approve a company-paid order

POST /organizations/{organizationId}/store-orders/{storeOrderId}/approve

BILLS THE CUSTOMER and EMAILS THE SHOPPER: an AWAITING_APPROVAL order becomes PLACED (in the production batch); its invoice to the store's customer stays a draft to send (POST /invoices/{invoiceId}/send or as part of a combined invoice). 409 for any other status.

Permissionstores.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 toolstoreOrders_approve (toolset stores)
ApprovalOver MCP, this tool asks for your OK first (in the AI app when it supports it, otherwise in SKUFlow). See Approvals.

Parameters

NameInTypeRequiredDescription
storeOrderIdpathstringYesThe store order (GET /store-orders).

Example

curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/store-orders/{storeOrderId}/approve" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY"

Response

200: the answer's fields
FieldTypeDescription
idstring
identifierstringSO-n.
storeIdstring
storeobject
store.idstring
store.namestring
statusenumPENDING_PAYMENT (waiting for Stripe Checkout), AWAITING_APPROVAL (company-paid), PLACED (paid or approved: in the batch), FULFILLED, REJECTED or CANCELLED. One of PENDING_PAYMENT, AWAITING_APPROVAL, PLACED, FULFILLED, REJECTED, CANCELLED.
checkoutModeenumPAY_ONLINE (shoppers pay by card on Stripe Checkout, on the business's connected account), INVOICE_ACCOUNT (the store's customer is invoiced; orders wait for approval) or FREE (the customer pays; each person spends from allowanceCents). One of PAY_ONLINE, INVOICE_ACCOUNT, FREE.
customerIdstring or nullWho is billed: the shopper (PAY_ONLINE) or the store's customer.
invoiceIdstring or null
invoiceobject or null
invoice.idstring
invoice.identifierstring
invoice.statusstring
buyerNamestring
buyerEmailstring
buyerPhonestring or null
shippingMethodobject
shippingMethod.idstring
shippingMethod.kindstring
shippingMethod.labelstring
shippingAddressobject or null
shippingAddress.namestring
shippingAddress.line1string
shippingAddress.line2string
shippingAddress.citystring
shippingAddress.statestring
shippingAddress.postalCodestring
shippingAddress.countrystring
subtotalCentsintegerInteger cents.
shippingCentsintegerInteger cents.
taxCentsintegerInteger cents.
totalCentsintegerInteger cents.
allowanceCentsintegerInteger cents.
raisedCentsintegerInteger cents.
approverNamestring or null
approverEmailstring or null
costCenterstring or null
poNumberstring or null
notestring or null
linesarray of object
lines[].productNamestring
lines[].colorNamestring or null
lines[].sizestring or null
lines[].quantityinteger
lines[].unitPriceCentsintegerInteger cents.
lines[].lineTotalCentsintegerInteger cents.
lines[].personalizationarray of object
lines[].personalization[].keystring
lines[].personalization[].labelstring
lines[].personalization[].valuestring
orderUrlstringThe shopper's confirmation page.
placedAtstring (date-time) or null
createdAtstring (date-time)

Reject a company-paid order

POST /organizations/{organizationId}/store-orders/{storeOrderId}/reject

EMAILS THE SHOPPER (with the reason): an AWAITING_APPROVAL order becomes REJECTED and its draft invoice is cancelled; a FREE store gives the allowance back. 409 for any other status.

Permissionstores.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 toolstoreOrders_reject (toolset stores)
ApprovalOver MCP, this tool asks for your OK first (in the AI app when it supports it, otherwise in SKUFlow). See Approvals.

Parameters

NameInTypeRequiredDescription
storeOrderIdpathstringYesThe store order (GET /store-orders).

Request body

FieldTypeRequiredDescription
reasonstring or nullNoUp to 500 characters.

Example

curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/store-orders/{storeOrderId}/reject" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"reason":"string"}'

Response

200: the answer's fields
FieldTypeDescription
idstring
identifierstringSO-n.
storeIdstring
storeobject
store.idstring
store.namestring
statusenumPENDING_PAYMENT (waiting for Stripe Checkout), AWAITING_APPROVAL (company-paid), PLACED (paid or approved: in the batch), FULFILLED, REJECTED or CANCELLED. One of PENDING_PAYMENT, AWAITING_APPROVAL, PLACED, FULFILLED, REJECTED, CANCELLED.
checkoutModeenumPAY_ONLINE (shoppers pay by card on Stripe Checkout, on the business's connected account), INVOICE_ACCOUNT (the store's customer is invoiced; orders wait for approval) or FREE (the customer pays; each person spends from allowanceCents). One of PAY_ONLINE, INVOICE_ACCOUNT, FREE.
customerIdstring or nullWho is billed: the shopper (PAY_ONLINE) or the store's customer.
invoiceIdstring or null
invoiceobject or null
invoice.idstring
invoice.identifierstring
invoice.statusstring
buyerNamestring
buyerEmailstring
buyerPhonestring or null
shippingMethodobject
shippingMethod.idstring
shippingMethod.kindstring
shippingMethod.labelstring
shippingAddressobject or null
shippingAddress.namestring
shippingAddress.line1string
shippingAddress.line2string
shippingAddress.citystring
shippingAddress.statestring
shippingAddress.postalCodestring
shippingAddress.countrystring
subtotalCentsintegerInteger cents.
shippingCentsintegerInteger cents.
taxCentsintegerInteger cents.
totalCentsintegerInteger cents.
allowanceCentsintegerInteger cents.
raisedCentsintegerInteger cents.
approverNamestring or null
approverEmailstring or null
costCenterstring or null
poNumberstring or null
notestring or null
linesarray of object
lines[].productNamestring
lines[].colorNamestring or null
lines[].sizestring or null
lines[].quantityinteger
lines[].unitPriceCentsintegerInteger cents.
lines[].lineTotalCentsintegerInteger cents.
lines[].personalizationarray of object
lines[].personalization[].keystring
lines[].personalization[].labelstring
lines[].personalization[].valuestring
orderUrlstringThe shopper's confirmation page.
placedAtstring (date-time) or null
createdAtstring (date-time)

Cancel a store order

POST /organizations/{organizationId}/store-orders/{storeOrderId}/cancel

Destructive: cancels the order and its unpaid invoice; it leaves the batch and a FREE store gives the allowance back. A paid order is 409: refund its payment first (POST /payments/{paymentId}/refunds), then cancel. Fulfilled orders can't be cancelled.

Permissionstores.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 toolstoreOrders_cancel (toolset stores)
ApprovalOver MCP, this tool asks for your OK first (in the AI app when it supports it, otherwise in SKUFlow). See Approvals.

Parameters

NameInTypeRequiredDescription
storeOrderIdpathstringYesThe store order (GET /store-orders).

Example

curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/store-orders/{storeOrderId}/cancel" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY"

Response

200: the answer's fields
FieldTypeDescription
idstring
identifierstringSO-n.
storeIdstring
storeobject
store.idstring
store.namestring
statusenumPENDING_PAYMENT (waiting for Stripe Checkout), AWAITING_APPROVAL (company-paid), PLACED (paid or approved: in the batch), FULFILLED, REJECTED or CANCELLED. One of PENDING_PAYMENT, AWAITING_APPROVAL, PLACED, FULFILLED, REJECTED, CANCELLED.
checkoutModeenumPAY_ONLINE (shoppers pay by card on Stripe Checkout, on the business's connected account), INVOICE_ACCOUNT (the store's customer is invoiced; orders wait for approval) or FREE (the customer pays; each person spends from allowanceCents). One of PAY_ONLINE, INVOICE_ACCOUNT, FREE.
customerIdstring or nullWho is billed: the shopper (PAY_ONLINE) or the store's customer.
invoiceIdstring or null
invoiceobject or null
invoice.idstring
invoice.identifierstring
invoice.statusstring
buyerNamestring
buyerEmailstring
buyerPhonestring or null
shippingMethodobject
shippingMethod.idstring
shippingMethod.kindstring
shippingMethod.labelstring
shippingAddressobject or null
shippingAddress.namestring
shippingAddress.line1string
shippingAddress.line2string
shippingAddress.citystring
shippingAddress.statestring
shippingAddress.postalCodestring
shippingAddress.countrystring
subtotalCentsintegerInteger cents.
shippingCentsintegerInteger cents.
taxCentsintegerInteger cents.
totalCentsintegerInteger cents.
allowanceCentsintegerInteger cents.
raisedCentsintegerInteger cents.
approverNamestring or null
approverEmailstring or null
costCenterstring or null
poNumberstring or null
notestring or null
linesarray of object
lines[].productNamestring
lines[].colorNamestring or null
lines[].sizestring or null
lines[].quantityinteger
lines[].unitPriceCentsintegerInteger cents.
lines[].lineTotalCentsintegerInteger cents.
lines[].personalizationarray of object
lines[].personalization[].keystring
lines[].personalization[].labelstring
lines[].personalization[].valuestring
orderUrlstringThe shopper's confirmation page.
placedAtstring (date-time) or null
createdAtstring (date-time)

Mark store orders fulfilled

POST /organizations/{organizationId}/store-orders/fulfil

Marks PLACED orders as handed over or shipped: the storeOrderIds given (409 if one isn't PLACED), or every placed order of storeId.

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

Request body

FieldTypeRequiredDescription
storeIdstring or nullNoEvery placed order of this store.
storeOrderIdsarray of string or nullNoUp to 500 items.

Example

curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/store-orders/fulfil" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"storeId":"store_id","storeOrderIds":["storeOrder_id"]}'

Response

200: the answer's fields
FieldTypeDescription
fulfilledinteger

On this page

List online storesParametersExampleResponseCreate an online storeRequest bodyExampleResponseAn online storeParametersExampleResponseChange an online storeParametersRequest bodyExampleResponseDelete an online storeParametersExampleResponseOpen a store for ordersParametersExampleResponseClose a storeParametersExampleResponseSet a store's categoriesParametersRequest bodyExampleResponseA store's salesParametersExampleResponseA store's production batchParametersExampleResponseExport a store's orders (CSV)ParametersExampleResponseDraft a store's banner and categoriesRequest bodyExampleResponseUpload a store pictureRequest bodyExampleResponseA store's invitesParametersExampleResponseInvite people to a storeParametersRequest bodyExampleResponseA store's custom domainsParametersExampleResponseConnect a custom domain to a storeParametersRequest bodyExampleResponseCheck a store domain's DNS nowParametersExampleResponseMake a domain the store's main addressParametersExampleResponseDisconnect a store domainParametersExampleResponseRemove an inviteParametersExampleResponseA store's productsParametersExampleResponseAdd products to a storeParametersRequest bodyExampleResponseChange a store productParametersRequest bodyExampleResponseRemove a product from a storeParametersExampleResponseList store ordersParametersExampleResponseA store orderParametersExampleResponseApprove a company-paid orderParametersExampleResponseReject a company-paid orderParametersRequest bodyExampleResponseCancel a store orderParametersExampleResponseMark store orders fulfilledRequest bodyExampleResponse