Now inviting stores. Join the waitlist to hear RowCall call you.

Join the waitlist

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.

  • okbooleanrequired

    One oftrue

  • storeslist of Storerequired
    Show 6 fields inside
    • idstringrequired
    • platformstringrequired

      custom for a store your system keeps; shopify for one connected.

    • keystringrequired

      Your id for it (custom), or the shop’s address (Shopify).

    • namestring or nullrequired
    • statusstringrequired
    • createdAtstringrequired
Request
curl https://app.rowcall.ai/v1/stores \
  -H "Authorization: Bearer $ROWCALL_API_KEY"
Response
{
  "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

  • namestringrequired
  • keystringrequired

    Your id for the store, unique in your org: main, halden-in.

Returns 201

Done.

  • okbooleanrequired

    One oftrue

  • storeStorerequired
    Show 6 fields inside
    • idstringrequired
    • platformstringrequired

      custom for a store your system keeps; shopify for one connected.

    • keystringrequired

      Your id for it (custom), or the shop’s address (Shopify).

    • namestring or nullrequired
    • statusstringrequired
    • createdAtstringrequired
  • isNewbooleanrequired

    Whether the store was added just now.

Request
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"
  }'
Response
{
  "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 objectrequired
    Show 28 fields inside
    • externalIdstringrequired

      Your id for it, unique in the store.

    • createdAtstringrequired
    • updatedAtstringrequired

      The version: an older copy never replaces a newer one.

    • platformStatusmap of string or null

      Your system’s own statuses, kept as you send them.

      Default {}

    • customAttributeslist of object

      Your own fields, searchable.

      Default []

      Show 2 fields inside
      • keystringrequired
      • valuestringrequired
    • extensionsmap of any

      Anything else, kept with the object and never searched.

      Default {}

    • numberstringrequired

      The order number shoppers see: #1042.

    • statusstring

      One ofopenclosedcancelled

      Default "open"

    • cancelledAtstring or null
    • closedAtstring or null
    • cancelReasonstring or null
    • isTestboolean

      Default false

    • sourceChannelstring or null
    • localestring or null
    • currencystringrequired
    • totalsobjectrequired
      Show 7 fields inside
      • totalintegerrequired

        Minor units (paise for INR), an integer.

      • subtotalinteger or null

        Minor units (paise for INR), an integer.

      • discountsinteger or null

        Minor units (paise for INR), an integer.

      • shippinginteger or null

        Minor units (paise for INR), an integer.

      • taxinteger or null

        Minor units (paise for INR), an integer.

      • outstandinginteger or null

        What the shopper still owes (cash on delivery: the total).

      • refundedinteger or null

        Minor units (paise for INR), an integer.

    • paymentobjectrequired
      Show 3 fields inside
      • statusstring or null

        One ofpendingauthorizedpartially_paidpaidpartially_refundedrefundedvoidedfailed

      • methodstring

        One ofcodprepaidunknown

        Default "unknown"

      • gatewayslist of string

        Default []

    • fulfillmentStatusstring or null

      One ofunfulfilledin_progresspartially_fulfilledfulfilledon_holdnot_requiredcancelled

    • deliveryobject or null
      Show 3 fields inside
      • statusstring or null

        One ofshippedout_for_deliveryattempteddeliveredfailed

      • deliveredAtstring or null
      • fulfillmentIdstring or null

        The fulfillment it’s about (its externalId).

    • customerobject or null
      Show 4 fields inside
      • externalIdstring or null
      • namestring or null
      • emailstring or null
      • phonestring or null
    • phonestring or null

      The order’s own phone, when it isn’t on an address.

    • shippingAddressobject or null
      Show 9 fields inside
      • namestring or null
      • line1string or null
      • line2string or null
      • citystring or null
      • statestring or null
      • stateCodestring or null
      • pincodestring or null
      • countrystring or null
      • phonestring or null
    • billingAddressobject or null
      Show 9 fields inside
      • namestring or null
      • line1string or null
      • line2string or null
      • citystring or null
      • statestring or null
      • stateCodestring or null
      • pincodestring or null
      • countrystring or null
      • phonestring or null
    • lineItemslist of object

      Default []

      Show 12 fields inside
      • externalIdstringrequired
      • titlestringrequired
      • variantTitlestring or null
      • skustring or null
      • quantityintegerrequired
      • currentQuantityinteger or null
      • unitPriceintegerrequired

        Minor units (paise for INR), an integer.

      • totalintegerrequired

        Minor units (paise for INR), an integer.

      • productExternalIdstring or null
      • variantExternalIdstring or null
      • imageUrlstring or null
      • customAttributeslist of object

        Your own fields, searchable.

        Default []

        Show 2 fields inside
        • keystringrequired
        • valuestringrequired
    • fulfillmentslist of object

      Default []

      Show 10 fields inside
      • externalIdstringrequired
      • deliveryStatusstring or null

        One ofshippedout_for_deliveryattempteddeliveredfailed

      • isCancelledboolean

        Default false

      • createdAtstringrequired
      • shippedAtstring or null
      • deliveredAtstring or null
      • estimatedDeliveryAtstring or null
      • carrierstring or null
      • trackingNumberstring or null
      • trackingUrlstring or null
    • refundslist of object

      Default []

      Show 4 fields inside
      • externalIdstringrequired
      • createdAtstringrequired
      • amountintegerrequired

        Minor units (paise for INR), an integer.

      • notestring or null
    • tagslist of string

      Default []

    • notestring or null

Returns 200

Done.

  • okbooleanrequired

    One oftrue

  • runIdstringrequired

    The 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 objectrequired
    Show 2 fields inside
    • externalIdstringrequired
    • outcomestringrequired

      One ofwrittenunchangedstalefailedredacted

Request
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"
        ]
      }
    ]
  }'
Response
{
  "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 objectrequired
    Show 11 fields inside
    • externalIdstringrequired

      Your id for it, unique in the store.

    • createdAtstringrequired
    • updatedAtstringrequired

      The version: an older copy never replaces a newer one.

    • platformStatusmap of string or null

      Your system’s own statuses, kept as you send them.

      Default {}

    • customAttributeslist of object

      Your own fields, searchable.

      Default []

      Show 2 fields inside
      • keystringrequired
      • valuestringrequired
    • extensionsmap of any

      Anything else, kept with the object and never searched.

      Default {}

    • orderExternalIdstringrequired

      The order it returns (its externalId).

    • namestring or null
    • statusstringrequired

      One ofrequestedapproveddeclinedin_progressclosedcancelled

    • closedAtstring or null
    • itemslist of object

      Default []

      Show 8 fields inside
      • externalIdstringrequired
      • lineItemExternalIdstring or null
      • titlestring or null
      • variantTitlestring or null
      • quantityintegerrequired
      • reasonstring or null
      • reasonNotestring or null
      • customerNotestring or null

Returns 200

Done.

  • okbooleanrequired

    One oftrue

  • runIdstringrequired

    The 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 objectrequired
    Show 2 fields inside
    • externalIdstringrequired
    • outcomestringrequired

      One ofwrittenunchangedstalefailedredacted

Request
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"
          }
        ]
      }
    ]
  }'
Response
{
  "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 objectrequired
    Show 18 fields inside
    • externalIdstringrequired

      Your id for it, unique in the store.

    • createdAtstringrequired
    • updatedAtstringrequired

      The version: an older copy never replaces a newer one.

    • platformStatusmap of string or null

      Your system’s own statuses, kept as you send them.

      Default {}

    • customAttributeslist of object

      Your own fields, searchable.

      Default []

      Show 2 fields inside
      • keystringrequired
      • valuestringrequired
    • extensionsmap of any

      Anything else, kept with the object and never searched.

      Default {}

    • namestring or null
    • firstNamestring or null
    • lastNamestring or null
    • emailstring or null
    • phonestring or null
    • localestring or null

      Their language, such as hi or hi-IN.

    • tagslist of string

      Default []

    • isEnabledboolean or null
    • ordersCountinteger or null
    • amountSpentinteger or null

      Minor units (paise for INR), an integer.

    • currencystring or null
    • defaultAddressobject or null
      Show 9 fields inside
      • namestring or null
      • line1string or null
      • line2string or null
      • citystring or null
      • statestring or null
      • stateCodestring or null
      • pincodestring or null
      • countrystring or null
      • phonestring or null

Returns 200

Done.

  • okbooleanrequired

    One oftrue

  • runIdstringrequired

    The 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 objectrequired
    Show 2 fields inside
    • externalIdstringrequired
    • outcomestringrequired

      One ofwrittenunchangedstalefailedredacted

Request
curl -X PUT https://app.rowcall.ai/v1/stores/sto_h4k9d3n5s7t2r6e8w0q2/customers \
  -H "Authorization: Bearer $ROWCALL_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "customers": [
      {
        "externalId": "c-311",
        "createdAt": "2026-09-02T18:40:00+05:30",
        "updatedAt": "2026-10-13T09:12:00+05:30",
        "name": "Asha Rao",
        "phone": "98123 45678",
        "locale": "hi",
        "ordersCount": 3
      }
    ]
  }'
Response
{
  "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 objectrequired
    Show 15 fields inside
    • externalIdstringrequired

      Your id for it, unique in the store.

    • createdAtstringrequired
    • updatedAtstringrequired

      The version: an older copy never replaces a newer one.

    • platformStatusmap of string or null

      Your system’s own statuses, kept as you send them.

      Default {}

    • customAttributeslist of object

      Your own fields, searchable.

      Default []

      Show 2 fields inside
      • keystringrequired
      • valuestringrequired
    • extensionsmap of any

      Anything else, kept with the object and never searched.

      Default {}

    • titlestringrequired
    • handlestring or null
    • statusstring or null

      One ofactivedraftarchivedhidden

    • productTypestring or null
    • vendorstring or null
    • tagslist of string

      Default []

    • imageUrlstring or null
    • currencystring or null
    • variantslist of object

      Default []

      Show 8 fields inside
      • externalIdstringrequired
      • titlestring or null
      • skustring or null
      • barcodestring or null
      • priceinteger or null

        Minor units (paise for INR), an integer.

      • compareAtPriceinteger or null

        Minor units (paise for INR), an integer.

      • optionslist of object

        Default []

        Show 2 fields inside
        • namestringrequired
        • valuestringrequired
      • inventoryinteger or null

Returns 200

Done.

  • okbooleanrequired

    One oftrue

  • runIdstringrequired

    The 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 objectrequired
    Show 2 fields inside
    • externalIdstringrequired
    • outcomestringrequired

      One ofwrittenunchangedstalefailedredacted

Request
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
          }
        ]
      }
    ]
  }'
Response
{
  "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

  • storeIdstringrequired
  • entitystringrequired
  • externalIdstringrequired

Returns 200

Done.

  • okbooleanrequired

    One oftrue

  • isDeletedbooleanrequired

    False when RowCall had nothing by that id.

Request
curl -X DELETE https://app.rowcall.ai/v1/stores/sto_h4k9d3n5s7t2r6e8w0q2/orders/1042 \
  -H "Authorization: Bearer $ROWCALL_API_KEY"
Response
{
  "ok": true,
  "isDeleted": true
}