Skip to content

Daily sales feed

GET /v1/reports/daily-sales?from=2026-07-01&to=2026-07-31

One row per store per day, computed from the merchant’s sales and sales-return documents. Scope: adsr.read.

ParameterTypeRequiredNotes
fromstringyesYYYY-MM-DD, inclusive
tostringyesYYYY-MM-DD, inclusive
storeIdnumbernoOne store. Omit for every store the grant allows
hourlybooleannotrue adds a 24-bucket breakdown to each row

The window may not exceed 31 days. A wider range returns 400 partner.window_too_large.

Terminal window
curl -s "$API_BASE_URL/reports/daily-sales?from=2026-07-01&to=2026-07-31&storeId=1" \
-H "Authorization: Bearer $ACCESS_TOKEN"
200 OK
{
"data": [
{
"date": "2026-07-01",
"grossSales": 12345.67,
"taxAmount": 617.28,
"discountAmount": 120.00,
"refundAmount": 89.50,
"netSales": 11518.89,
"transactionCount": 214
},
{
"date": "2026-07-02",
"grossSales": 9880.10,
"taxAmount": 494.01,
"discountAmount": 0,
"refundAmount": 0,
"netSales": 9880.10,
"transactionCount": 173
}
]
}

Days with no trade are returned with zeroes rather than omitted, so a month always yields the same number of rows as it has days. Amounts are in the merchant’s own currency, as decimal numbers.

This is the part to read carefully. Point-of-sale totals have specific definitions and a lease clause usually names one of them.

FieldDefinition
dateTrading date, YYYY-MM-DD, in the store’s local calendar
grossSalesTotal billed value before discounts, including tax, service charges, delivery charges, tips and rounding
taxAmountAll tax on those sales — primary tax, secondary tax, cess and other statutory levies, plus tax on charges
discountAmountEvery discount given: bill-level, line-level and promotional
refundAmountValue returned to customers via sales-return documents dated in the window, tax included
netSalesgrossSales − discountAmount − rounding − refundAmount. Tax is still inside this figure
transactionCountNumber of completed, non-voided sale bills. Refunds are not counted as transactions; their value is in refundAmount
const taxExclusiveNet = row.netSales - row.taxAmount; // usual basis for percentage rent
const averageBasket = row.netSales / row.transactionCount;
const discountRate = row.discountAmount / row.grossSales;
  • Voided bills. A bill voided by staff never enters any figure.
  • Draft and parked orders. Only completed sales count.
  • Non-sales movement. Stock transfers, adjustments and purchases are not sales and never appear here.

A refund lands on the day the return document was raised, not the day of the original sale. A sale on the 3rd refunded on the 5th leaves the 3rd untouched and reduces the 5th. Feeds that restate history when a refund arrives will not reconcile with the merchant’s own reports.

Terminal window
curl -s "$API_BASE_URL/reports/daily-sales?from=2026-07-01&to=2026-07-01&storeId=1&hourly=true" \
-H "Authorization: Bearer $ACCESS_TOKEN"
{
"data": [
{
"date": "2026-07-01",
"grossSales": 12345.67,
"taxAmount": 617.28,
"discountAmount": 120.00,
"refundAmount": 89.50,
"netSales": 11518.89,
"transactionCount": 214,
"hourly": [
{ "hour": 0, "grossSales": 0, "transactionCount": 0 },
{ "hour": 11, "grossSales": 842.10, "transactionCount": 17 },
{ "hour": 12, "grossSales": 2104.55, "transactionCount": 41 }
]
}
]
}

All 24 buckets are always present, hour is 023 in store-local time, and the buckets sum to the day’s grossSales and transactionCount. Malls that report footfall against turnover use this; leave it off otherwise, since it multiplies the response size.

Omit storeId and the response covers every store the grant allows, still one row per store per day. Rows carry the store they belong to so you can split them:

Terminal window
curl -s "$API_BASE_URL/reports/daily-sales?from=2026-07-01&to=2026-07-07" \
-H "Authorization: Bearer $ACCESS_TOKEN"

If the grant is restricted to specific stores, that restriction is applied whether or not you pass storeId — asking for a store outside it returns no rows rather than an error.

CodeStatusCause
partner.window_too_large400to − from exceeds 31 days
400from or to missing or not YYYY-MM-DD, or to earlier than from
partner.scope_denied403Token lacks adsr.read
partner.grant_missing403The tenant’s grant was revoked
partner.rate_limited429More than 300 requests this minute