Daily sales feed
GET /v1/reports/daily-sales?from=2026-07-01&to=2026-07-31One row per store per day, computed from the merchant’s sales and sales-return documents.
Scope: adsr.read.
Parameters
Section titled “Parameters”| Parameter | Type | Required | Notes |
|---|---|---|---|
from | string | yes | YYYY-MM-DD, inclusive |
to | string | yes | YYYY-MM-DD, inclusive |
storeId | number | no | One store. Omit for every store the grant allows |
hourly | boolean | no | true adds a 24-bucket breakdown to each row |
The window may not exceed 31 days. A wider range returns 400 partner.window_too_large.
curl -s "$API_BASE_URL/reports/daily-sales?from=2026-07-01&to=2026-07-31&storeId=1" \ -H "Authorization: Bearer $ACCESS_TOKEN"const url = new URL('reports/daily-sales', apiBaseUrl);url.searchParams.set('from', '2026-07-01');url.searchParams.set('to', '2026-07-31');url.searchParams.set('storeId', '1');
const response = await fetch(url, { headers: { Authorization: `Bearer ${accessToken}` },});
const { data } = await response.json();for (const day of data) { console.log(day.date, day.netSales - day.taxAmount);}Response
Section titled “Response”{ "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.
Field semantics
Section titled “Field semantics”This is the part to read carefully. Point-of-sale totals have specific definitions and a lease clause usually names one of them.
| Field | Definition |
|---|---|
date | Trading date, YYYY-MM-DD, in the store’s local calendar |
grossSales | Total billed value before discounts, including tax, service charges, delivery charges, tips and rounding |
taxAmount | All tax on those sales — primary tax, secondary tax, cess and other statutory levies, plus tax on charges |
discountAmount | Every discount given: bill-level, line-level and promotional |
refundAmount | Value returned to customers via sales-return documents dated in the window, tax included |
netSales | grossSales − discountAmount − rounding − refundAmount. Tax is still inside this figure |
transactionCount | Number of completed, non-voided sale bills. Refunds are not counted as transactions; their value is in refundAmount |
Derived figures
Section titled “Derived figures”const taxExclusiveNet = row.netSales - row.taxAmount; // usual basis for percentage rentconst averageBasket = row.netSales / row.transactionCount;const discountRate = row.discountAmount / row.grossSales;What is excluded
Section titled “What is excluded”- 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.
Refund timing
Section titled “Refund timing”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.
Hourly breakdown
Section titled “Hourly breakdown”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 0–23 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.
Multiple stores
Section titled “Multiple stores”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:
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.
Errors
Section titled “Errors”| Code | Status | Cause |
|---|---|---|
partner.window_too_large | 400 | to − from exceeds 31 days |
| — | 400 | from or to missing or not YYYY-MM-DD, or to earlier than from |
partner.scope_denied | 403 | Token lacks adsr.read |
partner.grant_missing | 403 | The tenant’s grant was revoked |
partner.rate_limited | 429 | More than 300 requests this minute |