Skip to content

Reports

Six report endpoints cover the questions back-office tools ask most. All are GET, all accept the shared parameters below, and all return integer minor-unit money.

ParameterTypeNotes
from, toYYYY-MM-DDInclusive date range, required on every report except store-health. Maximum span 366 days
store_idstringLimit to one store; omit for the whole organization
group_byenumday (default), week, month, or store. Not every report supports every value — noted per endpoint
timezoneIANA nameDefaults to the store’s configured timezone (or the organization’s, for cross-store reports). Buckets and day boundaries are computed in this zone

GET /reports/sales-summary — revenue, order counts and averages per bucket. Supports every group_by.

Terminal window
curl -s "https://api.quiqqy.ai/api/v2/reports/sales-summary?from=2026-07-01&to=2026-07-28&group_by=day&store_id=st_8fk2c1p9" \
-H "Authorization: Bearer $ACCESS_TOKEN"
200 OK
{
"currency": "USD",
"timezone": "America/New_York",
"buckets": [
{
"period": "2026-07-01",
"orders": 118,
"gross_sales": 412350,
"discounts": 8210,
"refunds": 4599,
"net_sales": 399541,
"tax": 35958,
"tips": 21200,
"average_order_value": 3494
}
],
"totals": { "orders": 3287, "gross_sales": 11492801, "net_sales": 11170322 }
}

GET /reports/orders — the raw order feed for warehousing, cursor paginated. Filter with the shared parameters plus status and order_type.

Terminal window
curl -s "https://api.quiqqy.ai/api/v2/reports/orders?from=2026-07-01&to=2026-07-28&limit=200" \
-H "Authorization: Bearer $ACCESS_TOKEN"
200 OK
{
"data": [
{
"id": "ord_9d31f2",
"order_number": "ORD-20260730-0042",
"store_id": "st_8fk2c1p9",
"status": "delivered",
"order_type": "delivery",
"payment_status": "paid",
"currency": "USD",
"subtotal": 3548,
"tax": 319,
"tip": 300,
"total_amount": 4367,
"created_at": "2026-07-30T12:34:56.000Z",
"items": [
{ "product_name": "Margherita Pizza (Large)", "quantity": 1, "unit_price": 1699, "external_id": "SKU-MARG" }
]
}
],
"next_cursor": "eyJpZCI6Im9yZF85ZDMxZjIifQ"
}

Pass cursor=<next_cursor> to fetch the next page; a null next_cursor means you have everything. Cursors are opaque and expire after 15 minutes — resume a stale export by restarting from the last order’s created_at. limit accepts 1–500 (default 100).

GET /reports/top-items — best sellers by quantity and revenue. group_by supports store only; add limit (default 20).

200 OK
{
"currency": "USD",
"items": [
{ "external_id": "SKU-MARG", "product_name": "Margherita Pizza", "quantity": 1841, "net_sales": 2612359, "orders": 1502 },
{ "external_id": "SKU-TIRAMISU", "product_name": "Tiramisu", "quantity": 964, "net_sales": 723000, "orders": 811 }
]
}

external_id is the catalogue id (yours, if your app also manages the catalogue) — the join key back to your own systems.

GET /reports/hourly-demand — order volume by hour of day and day of week, for staffing and prep planning. The range’s orders are folded into a 7×24 matrix in the report timezone.

200 OK
{
"timezone": "America/New_York",
"matrix": [
{ "day": "fri", "hours": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 9, 31, 44, 27, 12, 8, 14, 38, 52, 41, 22, 9, 3] }
],
"peak": { "day": "fri", "hour": 19, "orders": 52 }
}

GET /reports/store-health — an operational snapshot per store, no date range needed. This is the report to poll for a chain dashboard.

200 OK
{
"stores": [
{
"store_id": "st_8fk2c1p9",
"name": "Main Street Pizza",
"status": "active",
"is_open": true,
"orders_today": 62,
"acceptance_rate_7d": 0.994,
"avg_accept_seconds_7d": 48,
"cancellation_rate_7d": 0.006,
"items_snoozed": 2,
"last_order_at": "2026-07-30T13:02:10.000Z"
}
]
}

GET /reports/payments-summary — takings by payment method and provider per bucket, for reconciliation. Supports every group_by.

200 OK
{
"currency": "USD",
"buckets": [
{
"period": "2026-07-28",
"methods": [
{ "payment_method": "card", "provider": "stripe", "orders": 84, "gross": 301220, "refunds": 4599, "net": 296621 },
{ "payment_method": "cash", "provider": null, "orders": 21, "gross": 61780, "refunds": 0, "net": 61780 }
]
}
]
}