Get Sales Summary
GET /v1/nextrestaurant/reports/sales-summary
Sales totals and a daily series
Needs reports:read and the Reports app. The same numbers as the admin
Reports screen, by venue calendar day. At most 366 days per request.
Request
GET https://your-site.example/api/index.php/v1/nextrestaurant/reports/sales-summary?from=<string>&to=<string>&location_id=<integer>
Parameters
| Name | Type | In | Required | Description |
|---|---|---|---|---|
from |
string |
query |
Yes | First venue calendar day, inclusive. (date) |
to |
string |
query |
Yes | Last venue calendar day, inclusive. At most 366 days after from. (date) |
location_id |
integer |
query |
No | Only this location. Omit for all. (min 1) |
Responses
200 — The summary.
{
"data": {
"from": "2026-01-01",
"to": "2026-01-01",
"location_id": 1,
"totals": {
"orders_count": 1,
"gross_sales": 1.5,
"net_sales": 1.5,
"tax_total": 1.5,
"service_total": 1.5,
"tips_total": 1.5,
"discount_total": 1.5,
"avg_order_value": 1.5,
"comp_total": 1.5,
"refund_total": 1.5
},
"days": [
{
"day": "2026-01-01",
"orders_count": 1,
"gross_sales": 1.5
}
]
}
}
| Field | Type | Meaning |
|---|---|---|
data.from |
string |
(date) |
data.to |
string |
(date) |
data.location_id |
integer|null |
|
data.totals.orders_count |
integer |
|
data.totals.gross_sales |
number |
|
data.totals.net_sales |
number |
|
data.totals.tax_total |
number |
|
data.totals.service_total |
number |
|
data.totals.tips_total |
number |
|
data.totals.discount_total |
number |
|
data.totals.avg_order_value |
number |
|
data.totals.comp_total |
number |
|
data.totals.refund_total |
number |
|
data.days[].day |
string |
(date) |
data.days[].orders_count |
integer |
|
data.days[].gross_sales |
number |
Errors
| Status | Code | When |
|---|---|---|
401 |
INVALID_TOKEN |
The token is missing, wrong, or none has been generated. |
403 |
INSUFFICIENT_SCOPE |
This API key does not have the permission this request needs. |
403 |
MODULE_DISABLED |
This module is disabled. |
403 |
API_DISABLED |
API is disabled |
404 |
UNKNOWN_LOCATION |
No such published location. |
422 |
VALIDATION_FAILED |
One error per invalid field, each with source.pointer. |
429 |
RATE_LIMITED |
Too many requests. RATE_LIMITED with a Retry-After header: this key used its budget for the minute, or this address sent 20 bad tokens in 5 minutes. Nothing ran, so the request is safe to retry after the wait. |
Examples
curl
curl -s "https://your-site.example/api/index.php/v1/nextrestaurant/reports/sales-summary?from=value&to=value" \
-H "Authorization: Bearer $API_TOKEN"
PHP
<?php
$ch = curl_init('https://your-site.example/api/index.php/v1/nextrestaurant/reports/sales-summary?from=<string>&to=<string>&location_id=<integer>');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('API_TOKEN'),
],
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
JavaScript
const API_TOKEN = process.env.API_TOKEN;
const response = await fetch("https://your-site.example/api/index.php/v1/nextrestaurant/reports/sales-summary?from=<string>&to=<string>&location_id=<integer>", {
headers: {
"Authorization": `Bearer ${API_TOKEN}`,
},
});
const data = await response.json();