Stores
A store your own system keeps in RowCall: its orders, customers, returns and products. Calls read them and changes start flows. Shopify connects in-app.
List stores
GET/stores
Your org’s stores: the ones your system keeps (custom) and the ones connected in the app.
Needs the commerce scope.
Returns 200
Done.
okbooleanrequiredOne of
truestoreslist of StorerequiredShow 6 fields insideHide the fields inside
idstringrequiredplatformstringrequiredcustomfor a store your system keeps;shopifyfor one connected.keystringrequiredYour id for it (custom), or the shop’s address (Shopify).
namestring or nullrequiredstatusstringrequiredcreatedAtstringrequired
curl https://app.rowcall.ai/v1/stores \ -H "Authorization: Bearer $ROWCALL_API_KEY"
{
"ok": true,
"stores": [
{
"id": "sto_h4k9d3n5s7t2r6e8w0q2",
"platform": "custom",
"key": "main",
"name": "Halden",
"status": "connected",
"createdAt": "2026-10-13T04:00:00.000Z"
}
]
}Add a store
POST/stores
A store your system keeps in RowCall, by your own key for it: a new key adds one (201); a key you used before gives that store back. It is ready at once: send its data with the routes below. Live keys only.
Needs the commerce scope.
Body
namestringrequiredkeystringrequiredYour id for the store, unique in your org: main, halden-in.
Returns 201
Done.
okbooleanrequiredOne of
truestoreStorerequiredShow 6 fields insideHide the fields inside
idstringrequiredplatformstringrequiredcustomfor a store your system keeps;shopifyfor one connected.keystringrequiredYour id for it (custom), or the shop’s address (Shopify).
namestring or nullrequiredstatusstringrequiredcreatedAtstringrequired
isNewbooleanrequiredWhether the store was added just now.
curl -X POST https://app.rowcall.ai/v1/stores \
-H "Authorization: Bearer $ROWCALL_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Halden",
"key": "main"
}'{
"ok": true,
"store": {
"id": "sto_h4k9d3n5s7t2r6e8w0q2",
"platform": "custom",
"key": "main",
"name": "Halden",
"status": "connected",
"createdAt": "2026-10-13T04:00:00.000Z"
},
"isNew": true
}Send orders
PUT/stores/{storeId}/orders
Up to 500 orders, new or changed, in RowCall’s commerce model. Money in minor units (paise), times with an offset. The copy with the newest updatedAt wins, so repeats and out-of-order sends are safe. RowCall finds the shopper’s Indian number to call (shipping address, then the order, billing and customer) and their contact. Each request is recorded as a sync run, with what you sent kept for the trace.
Needs the commerce scope.
Path
storeIdstringrequired
Body
orderslist of objectrequiredShow 28 fields insideHide the fields inside
externalIdstringrequiredYour id for it, unique in the store.
createdAtstringrequiredupdatedAtstringrequiredThe version: an older copy never replaces a newer one.
platformStatusmap of string or nullYour system’s own statuses, kept as you send them.
Default
{}customAttributeslist of objectYour own fields, searchable.
Default
[]Show 2 fields insideHide the fields inside
keystringrequiredvaluestringrequired
extensionsmap of anyAnything else, kept with the object and never searched.
Default
{}numberstringrequiredThe order number shoppers see: #1042.
statusstringOne of
openclosedcancelledDefault
"open"cancelledAtstring or nullclosedAtstring or nullcancelReasonstring or nullisTestbooleanDefault
falsesourceChannelstring or nulllocalestring or nullcurrencystringrequiredtotalsobjectrequiredShow 7 fields insideHide the fields inside
totalintegerrequiredMinor units (paise for INR), an integer.
subtotalinteger or nullMinor units (paise for INR), an integer.
discountsinteger or nullMinor units (paise for INR), an integer.
shippinginteger or nullMinor units (paise for INR), an integer.
taxinteger or nullMinor units (paise for INR), an integer.
outstandinginteger or nullWhat the shopper still owes (cash on delivery: the total).
refundedinteger or nullMinor units (paise for INR), an integer.
paymentobjectrequiredShow 3 fields insideHide the fields inside
statusstring or nullOne of
pendingauthorizedpartially_paidpaidpartially_refundedrefundedvoidedfailedmethodstringOne of
codprepaidunknownDefault
"unknown"gatewayslist of stringDefault
[]
fulfillmentStatusstring or nullOne of
unfulfilledin_progresspartially_fulfilledfulfilledon_holdnot_requiredcancelleddeliveryobject or nullShow 3 fields insideHide the fields inside
statusstring or nullOne of
shippedout_for_deliveryattempteddeliveredfaileddeliveredAtstring or nullfulfillmentIdstring or nullThe fulfillment it’s about (its externalId).
customerobject or nullShow 4 fields insideHide the fields inside
externalIdstring or nullnamestring or nullemailstring or nullphonestring or null
phonestring or nullThe order’s own phone, when it isn’t on an address.
shippingAddressobject or nullShow 9 fields insideHide the fields inside
namestring or nullline1string or nullline2string or nullcitystring or nullstatestring or nullstateCodestring or nullpincodestring or nullcountrystring or nullphonestring or null
billingAddressobject or nullShow 9 fields insideHide the fields inside
namestring or nullline1string or nullline2string or nullcitystring or nullstatestring or nullstateCodestring or nullpincodestring or nullcountrystring or nullphonestring or null
lineItemslist of objectDefault
[]Show 12 fields insideHide the fields inside
externalIdstringrequiredtitlestringrequiredvariantTitlestring or nullskustring or nullquantityintegerrequiredcurrentQuantityinteger or nullunitPriceintegerrequiredMinor units (paise for INR), an integer.
totalintegerrequiredMinor units (paise for INR), an integer.
productExternalIdstring or nullvariantExternalIdstring or nullimageUrlstring or nullcustomAttributeslist of objectYour own fields, searchable.
Default
[]Show 2 fields insideHide the fields inside
keystringrequiredvaluestringrequired
fulfillmentslist of objectDefault
[]Show 10 fields insideHide the fields inside
externalIdstringrequireddeliveryStatusstring or nullOne of
shippedout_for_deliveryattempteddeliveredfailedisCancelledbooleanDefault
falsecreatedAtstringrequiredshippedAtstring or nulldeliveredAtstring or nullestimatedDeliveryAtstring or nullcarrierstring or nulltrackingNumberstring or nulltrackingUrlstring or null
refundslist of objectDefault
[]Show 4 fields insideHide the fields inside
externalIdstringrequiredcreatedAtstringrequiredamountintegerrequiredMinor units (paise for INR), an integer.
notestring or null
tagslist of stringDefault
[]notestring or null
Returns 200
Done.
okbooleanrequiredOne of
truerunIdstringrequiredThe sync run that recorded this request: its archived body and every object.
countsmap of numberrequired{ written, unchanged, stale, failed, … }: stale is a copy older than RowCall’s.
resultslist of objectrequiredShow 2 fields insideHide the fields inside
externalIdstringrequiredoutcomestringrequiredOne of
writtenunchangedstalefailedredacted
curl -X PUT https://app.rowcall.ai/v1/stores/sto_h4k9d3n5s7t2r6e8w0q2/orders \
-H "Authorization: Bearer $ROWCALL_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"orders": [
{
"externalId": "1042",
"number": "#1042",
"createdAt": "2026-10-13T09:12:00+05:30",
"updatedAt": "2026-10-13T09:12:00+05:30",
"currency": "INR",
"totals": {
"total": 149900,
"outstanding": 149900
},
"payment": {
"status": "pending",
"method": "cod",
"gateways": [
"Cash on Delivery"
]
},
"fulfillmentStatus": "unfulfilled",
"customer": {
"externalId": "c-311",
"name": "Asha Rao",
"phone": "98123 45678"
},
"shippingAddress": {
"name": "Asha Rao",
"line1": "12 MG Road",
"city": "Pune",
"pincode": "411001",
"country": "IN"
},
"lineItems": [
{
"externalId": "li-1",
"title": "Steel bottle",
"quantity": 1,
"unitPrice": 149900,
"total": 149900
}
],
"tags": [
"first-order"
]
}
]
}'{
"ok": true,
"runId": "syn_k2m4n6p8q0r2s4t6u8v0",
"counts": {
"fetched": 1,
"written": 1,
"unchanged": 0,
"stale": 0,
"failed": 0,
"redacted": 0,
"events": 1,
"contactsCreated": 1
},
"results": [
{
"externalId": "1042",
"outcome": "written"
}
]
}Send returns
PUT/stores/{storeId}/returns
Up to 500 returns, each naming its order by orderExternalId. As for orders, the newest wins.
Needs the commerce scope.
Path
storeIdstringrequired
Body
returnslist of objectrequiredShow 11 fields insideHide the fields inside
externalIdstringrequiredYour id for it, unique in the store.
createdAtstringrequiredupdatedAtstringrequiredThe version: an older copy never replaces a newer one.
platformStatusmap of string or nullYour system’s own statuses, kept as you send them.
Default
{}customAttributeslist of objectYour own fields, searchable.
Default
[]Show 2 fields insideHide the fields inside
keystringrequiredvaluestringrequired
extensionsmap of anyAnything else, kept with the object and never searched.
Default
{}orderExternalIdstringrequiredThe order it returns (its externalId).
namestring or nullstatusstringrequiredOne of
requestedapproveddeclinedin_progressclosedcancelledclosedAtstring or nullitemslist of objectDefault
[]Show 8 fields insideHide the fields inside
externalIdstringrequiredlineItemExternalIdstring or nulltitlestring or nullvariantTitlestring or nullquantityintegerrequiredreasonstring or nullreasonNotestring or nullcustomerNotestring or null
Returns 200
Done.
okbooleanrequiredOne of
truerunIdstringrequiredThe sync run that recorded this request: its archived body and every object.
countsmap of numberrequired{ written, unchanged, stale, failed, … }: stale is a copy older than RowCall’s.
resultslist of objectrequiredShow 2 fields insideHide the fields inside
externalIdstringrequiredoutcomestringrequiredOne of
writtenunchangedstalefailedredacted
curl -X PUT https://app.rowcall.ai/v1/stores/sto_h4k9d3n5s7t2r6e8w0q2/returns \
-H "Authorization: Bearer $ROWCALL_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"returns": [
{
"externalId": "r-77",
"orderExternalId": "1042",
"createdAt": "2026-10-18T11:00:00+05:30",
"updatedAt": "2026-10-18T11:00:00+05:30",
"status": "requested",
"items": [
{
"externalId": "ri-1",
"lineItemExternalId": "li-1",
"quantity": 1,
"reason": "Damaged"
}
]
}
]
}'{
"ok": true,
"runId": "syn_k2m4n6p8q0r2s4t6u8v0",
"counts": {
"fetched": 1,
"written": 1,
"unchanged": 0,
"stale": 0,
"failed": 0,
"redacted": 0,
"events": 1,
"contactsCreated": 1
},
"results": [
{
"externalId": "1042",
"outcome": "written"
}
]
}Send customers
PUT/stores/{storeId}/customers
Up to 500 customers. A callable Indian number links the customer to a contact (made if new); its name and language fill a contact that has none.
Needs the commerce scope.
Path
storeIdstringrequired
Body
customerslist of objectrequiredShow 18 fields insideHide the fields inside
externalIdstringrequiredYour id for it, unique in the store.
createdAtstringrequiredupdatedAtstringrequiredThe version: an older copy never replaces a newer one.
platformStatusmap of string or nullYour system’s own statuses, kept as you send them.
Default
{}customAttributeslist of objectYour own fields, searchable.
Default
[]Show 2 fields insideHide the fields inside
keystringrequiredvaluestringrequired
extensionsmap of anyAnything else, kept with the object and never searched.
Default
{}namestring or nullfirstNamestring or nulllastNamestring or nullemailstring or nullphonestring or nulllocalestring or nullTheir language, such as hi or hi-IN.
tagslist of stringDefault
[]isEnabledboolean or nullordersCountinteger or nullamountSpentinteger or nullMinor units (paise for INR), an integer.
currencystring or nulldefaultAddressobject or nullShow 9 fields insideHide the fields inside
namestring or nullline1string or nullline2string or nullcitystring or nullstatestring or nullstateCodestring or nullpincodestring or nullcountrystring or nullphonestring or null
Returns 200
Done.
okbooleanrequiredOne of
truerunIdstringrequiredThe sync run that recorded this request: its archived body and every object.
countsmap of numberrequired{ written, unchanged, stale, failed, … }: stale is a copy older than RowCall’s.
resultslist of objectrequiredShow 2 fields insideHide the fields inside
externalIdstringrequiredoutcomestringrequiredOne of
writtenunchangedstalefailedredacted
{
"ok": true,
"runId": "syn_k2m4n6p8q0r2s4t6u8v0",
"counts": {
"fetched": 1,
"written": 1,
"unchanged": 0,
"stale": 0,
"failed": 0,
"redacted": 0,
"events": 1,
"contactsCreated": 1
},
"results": [
{
"externalId": "1042",
"outcome": "written"
}
]
}Send products
PUT/stores/{storeId}/products
Up to 500 products with their variants, so calls can name what was ordered.
Needs the commerce scope.
Path
storeIdstringrequired
Body
productslist of objectrequiredShow 15 fields insideHide the fields inside
externalIdstringrequiredYour id for it, unique in the store.
createdAtstringrequiredupdatedAtstringrequiredThe version: an older copy never replaces a newer one.
platformStatusmap of string or nullYour system’s own statuses, kept as you send them.
Default
{}customAttributeslist of objectYour own fields, searchable.
Default
[]Show 2 fields insideHide the fields inside
keystringrequiredvaluestringrequired
extensionsmap of anyAnything else, kept with the object and never searched.
Default
{}titlestringrequiredhandlestring or nullstatusstring or nullOne of
activedraftarchivedhiddenproductTypestring or nullvendorstring or nulltagslist of stringDefault
[]imageUrlstring or nullcurrencystring or nullvariantslist of objectDefault
[]Show 8 fields insideHide the fields inside
externalIdstringrequiredtitlestring or nullskustring or nullbarcodestring or nullpriceinteger or nullMinor units (paise for INR), an integer.
compareAtPriceinteger or nullMinor units (paise for INR), an integer.
optionslist of objectDefault
[]Show 2 fields insideHide the fields inside
namestringrequiredvaluestringrequired
inventoryinteger or null
Returns 200
Done.
okbooleanrequiredOne of
truerunIdstringrequiredThe sync run that recorded this request: its archived body and every object.
countsmap of numberrequired{ written, unchanged, stale, failed, … }: stale is a copy older than RowCall’s.
resultslist of objectrequiredShow 2 fields insideHide the fields inside
externalIdstringrequiredoutcomestringrequiredOne of
writtenunchangedstalefailedredacted
curl -X PUT https://app.rowcall.ai/v1/stores/sto_h4k9d3n5s7t2r6e8w0q2/products \
-H "Authorization: Bearer $ROWCALL_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"products": [
{
"externalId": "p-9",
"createdAt": "2026-06-01T10:00:00+05:30",
"updatedAt": "2026-10-01T10:00:00+05:30",
"title": "Steel bottle",
"status": "active",
"variants": [
{
"externalId": "v-91",
"title": "1 litre",
"sku": "BTL-1L",
"price": 149900
}
]
}
]
}'{
"ok": true,
"runId": "syn_k2m4n6p8q0r2s4t6u8v0",
"counts": {
"fetched": 1,
"written": 1,
"unchanged": 0,
"stale": 0,
"failed": 0,
"redacted": 0,
"events": 1,
"contactsCreated": 1
},
"results": [
{
"externalId": "1042",
"outcome": "written"
}
]
}Delete an order, return, customer or product
DELETE/stores/{storeId}/{entity}/{externalId}
One object your system deleted (entity is orders, returns, customers or products). An order’s returns go with it. Its history stays in the trace.
Needs the commerce scope.
Path
storeIdstringrequiredentitystringrequiredexternalIdstringrequired
Returns 200
Done.
okbooleanrequiredOne of
trueisDeletedbooleanrequiredFalse when RowCall had nothing by that id.
curl -X DELETE https://app.rowcall.ai/v1/stores/sto_h4k9d3n5s7t2r6e8w0q2/orders/1042 \ -H "Authorization: Bearer $ROWCALL_API_KEY"
{
"ok": true,
"isDeleted": true
}