API de FlavosoReferencia de la APIInformes
Informes
Ventas por día, semana o mes y ventas por plato, con las mismas reglas que las cifras del panel. Más en Informes.
Endpoints
Sales report
get/reports/sales
- Permiso:
reports:read- Plan:
- todos los planes
Sales of a period, per day, week (Monday to Sunday), month or in total, with exactly the numbers the restaurant's dashboard and its DATEV export show: cancelled orders are not revenue, an online order counts once it is paid, days are local days of the restaurant.
gross is what guests paid without tips (items, delivery and service fees, minus discounts). VAT is computed per day, payment method and rate and then summed, like the accounting export; net is gross - tax. Amounts without a stored VAT rate appear in by_tax_rate with rate_bps: null and count fully into net.
Parámetros
| Nombre | Ubicación | Descripción |
|---|---|---|
fromstring (date)obligatorio | query | First day of the report, a local date of the restaurant (YYYY-MM-DD). Included. |
tostring (date)obligatorio | query | Last day of the report, a local date (YYYY-MM-DD). Included. At most 366 days after from. |
group_bystring | query | day (default), week, month or total. Periods at the edges are cut to from and to."day""week""month""total"default "day" |
Respuesta200
OK
objectstringobligatorioAlways
sales_report.Valores:
"sales_report"currencystringobligatorioISO 4217 of all amounts.
timezonestringobligatorioThe time zone the days are counted in.
fromstring (date)obligatorioFirst day, included. A date YYYY-MM-DD in the restaurant's time zone.
tostring (date)obligatorioLast day, included. A date YYYY-MM-DD in the restaurant's time zone.
group_bystringobligatorioThe period of each bucket.
Valores:
"day""week""month""total"totalsSalesBucketobligatorioThe whole period.
Campos anidados (14)
period_startstring (date)obligatorioFirst day of the period (cut to from). A date YYYY-MM-DD in the restaurant's time zone.
period_endstring (date)obligatorioLast day of the period (cut to to), included. A date YYYY-MM-DD in the restaurant's time zone.
ordersintegerobligatorioCounted orders (not cancelled; online ones only when paid).
grossintegerobligatorioWhat guests paid without tips: items, delivery and service fees, minus discounts. Integer amount in the smallest currency unit (cents).
netintegerobligatoriogross − tax. Integer amount in the smallest currency unit (cents).
taxintegerobligatorioVAT contained in gross, computed per day, payment method and rate. Integer amount in the smallest currency unit (cents).
tipsintegerobligatorioTips (pass-through, not revenue). Integer amount in the smallest currency unit (cents).
delivery_feesintegerobligatorioDelivery fees, included in gross. Integer amount in the smallest currency unit (cents).
service_feesintegerobligatorioService fees, included in gross. Integer amount in the smallest currency unit (cents).
discountsintegerobligatorioDiscounts (stamp card), already subtracted from gross. Integer amount in the smallest currency unit (cents).
by_tax_rateTaxLine[]obligatoriogross, net and tax per rate; rate_bps null for amounts without a stored rate.
Campos anidados (4)
rate_bpsintegerobligatoriopuede ser nullThe rate in basis points (700 = 7 %). null: no rate was stored for this part (not the same as 0 %); then net and tax are null.
grossintegerobligatorioGross amount at this rate. Integer amount in the smallest currency unit (cents).
netintegerobligatoriopuede ser nullgross − tax, in cents. null when rate_bps is null.
taxintegerobligatoriopuede ser nullVAT contained in gross: round(gross × rate / (10000 + rate)), in cents. null when rate_bps is null.
by_payment_methodobjectobligatorioSplit by payment method.
Campos anidados (2)
onlinePaymentSplitobligatorioOrders, gross (without tips) and tips of one part.
Campos anidados (3)
ordersintegerobligatorioCounted orders.
grossintegerobligatorioGross without tips. Integer amount in the smallest currency unit (cents).
tipsintegerobligatorioTips. Integer amount in the smallest currency unit (cents).
on_sitePaymentSplitobligatorioOrders, gross (without tips) and tips of one part.
Campos anidados (3)
ordersintegerobligatorioCounted orders.
grossintegerobligatorioGross without tips. Integer amount in the smallest currency unit (cents).
tipsintegerobligatorioTips. Integer amount in the smallest currency unit (cents).
by_typeobjectobligatorioSplit by order type.
Campos anidados (3)
pickupPaymentSplitobligatorioOrders, gross (without tips) and tips of one part.
Campos anidados (3)
ordersintegerobligatorioCounted orders.
grossintegerobligatorioGross without tips. Integer amount in the smallest currency unit (cents).
tipsintegerobligatorioTips. Integer amount in the smallest currency unit (cents).
deliveryPaymentSplitobligatorioOrders, gross (without tips) and tips of one part.
Campos anidados (3)
ordersintegerobligatorioCounted orders.
grossintegerobligatorioGross without tips. Integer amount in the smallest currency unit (cents).
tipsintegerobligatorioTips. Integer amount in the smallest currency unit (cents).
dine_inPaymentSplitobligatorioOrders, gross (without tips) and tips of one part.
Campos anidados (3)
ordersintegerobligatorioCounted orders.
grossintegerobligatorioGross without tips. Integer amount in the smallest currency unit (cents).
tipsintegerobligatorioTips. Integer amount in the smallest currency unit (cents).
cancelledobjectobligatorioOrders placed (and paid, if online) and later cancelled; not part of the figures above.
Campos anidados (2)
ordersintegerobligatorioHow many.
grossintegerobligatorioTheir totals. Integer amount in the smallest currency unit (cents).
bucketsSalesBucket[]obligatorioEvery period of the range, also those without orders.
Campos anidados (14)
period_startstring (date)obligatorioFirst day of the period (cut to from). A date YYYY-MM-DD in the restaurant's time zone.
period_endstring (date)obligatorioLast day of the period (cut to to), included. A date YYYY-MM-DD in the restaurant's time zone.
ordersintegerobligatorioCounted orders (not cancelled; online ones only when paid).
grossintegerobligatorioWhat guests paid without tips: items, delivery and service fees, minus discounts. Integer amount in the smallest currency unit (cents).
netintegerobligatoriogross − tax. Integer amount in the smallest currency unit (cents).
taxintegerobligatorioVAT contained in gross, computed per day, payment method and rate. Integer amount in the smallest currency unit (cents).
tipsintegerobligatorioTips (pass-through, not revenue). Integer amount in the smallest currency unit (cents).
delivery_feesintegerobligatorioDelivery fees, included in gross. Integer amount in the smallest currency unit (cents).
service_feesintegerobligatorioService fees, included in gross. Integer amount in the smallest currency unit (cents).
discountsintegerobligatorioDiscounts (stamp card), already subtracted from gross. Integer amount in the smallest currency unit (cents).
by_tax_rateTaxLine[]obligatoriogross, net and tax per rate; rate_bps null for amounts without a stored rate.
Campos anidados (4)
rate_bpsintegerobligatoriopuede ser nullThe rate in basis points (700 = 7 %). null: no rate was stored for this part (not the same as 0 %); then net and tax are null.
grossintegerobligatorioGross amount at this rate. Integer amount in the smallest currency unit (cents).
netintegerobligatoriopuede ser nullgross − tax, in cents. null when rate_bps is null.
taxintegerobligatoriopuede ser nullVAT contained in gross: round(gross × rate / (10000 + rate)), in cents. null when rate_bps is null.
by_payment_methodobjectobligatorioSplit by payment method.
Campos anidados (2)
onlinePaymentSplitobligatorioOrders, gross (without tips) and tips of one part.
Campos anidados (3)
ordersintegerobligatorioCounted orders.
grossintegerobligatorioGross without tips. Integer amount in the smallest currency unit (cents).
tipsintegerobligatorioTips. Integer amount in the smallest currency unit (cents).
on_sitePaymentSplitobligatorioOrders, gross (without tips) and tips of one part.
Campos anidados (3)
ordersintegerobligatorioCounted orders.
grossintegerobligatorioGross without tips. Integer amount in the smallest currency unit (cents).
tipsintegerobligatorioTips. Integer amount in the smallest currency unit (cents).
by_typeobjectobligatorioSplit by order type.
Campos anidados (3)
pickupPaymentSplitobligatorioOrders, gross (without tips) and tips of one part.
Campos anidados (3)
ordersintegerobligatorioCounted orders.
grossintegerobligatorioGross without tips. Integer amount in the smallest currency unit (cents).
tipsintegerobligatorioTips. Integer amount in the smallest currency unit (cents).
deliveryPaymentSplitobligatorioOrders, gross (without tips) and tips of one part.
Campos anidados (3)
ordersintegerobligatorioCounted orders.
grossintegerobligatorioGross without tips. Integer amount in the smallest currency unit (cents).
tipsintegerobligatorioTips. Integer amount in the smallest currency unit (cents).
dine_inPaymentSplitobligatorioOrders, gross (without tips) and tips of one part.
Campos anidados (3)
ordersintegerobligatorioCounted orders.
grossintegerobligatorioGross without tips. Integer amount in the smallest currency unit (cents).
tipsintegerobligatorioTips. Integer amount in the smallest currency unit (cents).
cancelledobjectobligatorioOrders placed (and paid, if online) and later cancelled; not part of the figures above.
Campos anidados (2)
ordersintegerobligatorioHow many.
grossintegerobligatorioTheir totals. Integer amount in the smallest currency unit (cents).
Errores
400invalid_request: a parameter or the body is wrong, or it contains a query parameter or field the operation does not know.paramnames the field.401unauthorized: missing, malformed, expired or revoked access token, or the app was disconnected or suspended.403insufficient_scope,plan_required(withparamwhen an order type is not in the plan) oraccount_inactive.429rate_limited: more than 120 requests per minute on this connection. WaitRetry-Afterseconds.500server_error. Safe to retry with the same Idempotency-Key.
curl "https://api.flavoso.com/v1/reports/sales?from=2026-10-01&to=2026-10-31" \
-H "Authorization: Bearer $ACCESS_TOKEN"{
"object": "sales_report",
"currency": "EUR",
"timezone": "Europe/Berlin",
"from": "2026-10-05",
"to": "2026-10-11",
"group_by": "week",
"totals": {
"period_start": "2026-10-05",
"period_end": "2026-10-11",
"orders": 182,
"gross": 451230,
"net": 410954,
"tax": 40276,
"tips": 12840,
"delivery_fees": 21000,
"service_fees": 0,
"discounts": 3150,
"by_tax_rate": [
{
"rate_bps": 700,
"gross": 353210,
"net": 330103,
"tax": 23107
},
{
"rate_bps": 1900,
"gross": 98020,
"net": 82851,
"tax": 15169
}
],
"by_payment_method": {
"online": {
"orders": 121,
"gross": 301900,
"tips": 10210
},
"on_site": {
"orders": 61,
"gross": 149330,
"tips": 2630
}
},
"by_type": {
"pickup": {
"orders": 96,
"gross": 201140,
"tips": 4120
},
"delivery": {
"orders": 64,
"gross": 196300,
"tips": 7380
},
"dine_in": {
"orders": 22,
"gross": 53790,
"tips": 1340
}
},
"cancelled": {
"orders": 4,
"gross": 9870
}
},
"buckets": [
{
"period_start": "2026-10-05",
"period_end": "2026-10-11",
"orders": 182,
"gross": 451230,
"net": 410954,
"tax": 40276,
"tips": 12840,
"delivery_fees": 21000,
"service_fees": 0,
"discounts": 3150,
"by_tax_rate": [
{
"rate_bps": 700,
"gross": 353210,
"net": 330103,
"tax": 23107
},
{
"rate_bps": 1900,
"gross": 98020,
"net": 82851,
"tax": 15169
}
],
"by_payment_method": {
"online": {
"orders": 121,
"gross": 301900,
"tips": 10210
},
"on_site": {
"orders": 61,
"gross": 149330,
"tips": 2630
}
},
"by_type": {
"pickup": {
"orders": 96,
"gross": 201140,
"tips": 4120
},
"delivery": {
"orders": 64,
"gross": 196300,
"tips": 7380
},
"dine_in": {
"orders": 22,
"gross": 53790,
"tips": 1340
}
},
"cancelled": {
"orders": 4,
"gross": 9870
}
}
]
}Product sales report
get/reports/products
- Permiso:
reports:read- Plan:
- todos los planes
The best-selling dishes of a period: quantity and the sum of their order lines (price including options, before order discounts), counted like the sales report. A dish deleted from the menu appears under its name with product_id: null. A ranking without pages: has_more says whether more dishes sold than limit.
Parámetros
| Nombre | Ubicación | Descripción |
|---|---|---|
fromstring (date)obligatorio | query | First day of the report, a local date of the restaurant (YYYY-MM-DD). Included. |
tostring (date)obligatorio | query | Last day of the report, a local date (YYYY-MM-DD). Included. At most 366 days after from. |
limitinteger | query | How many dishes, 1 to 100. Default 25.1 to 100 · default 25 |
Respuesta200
OK
objectstringobligatorioAlways
list.Valores:
"list"dataProductSales[]obligatorioThe items of this page.
Campos anidados (5)
objectstringobligatorioAlways
product_sales.Valores:
"product_sales"product_idstring (uuid)obligatoriopuede ser nullThe dish; null when it was deleted from the menu.
namestringobligatorioThe dish's latest name in the period.
quantityintegerobligatorioUnits sold.
grossintegerobligatorioSum of its order lines (incl. options, before order discounts). Integer amount in the smallest currency unit (cents).
has_morebooleanobligatorioWhether another page follows.
next_cursorstringobligatoriopuede ser nullPass as
cursor(with the same filters) to get the next page; null on the last page.
Errores
400invalid_request: a parameter or the body is wrong, or it contains a query parameter or field the operation does not know.paramnames the field.401unauthorized: missing, malformed, expired or revoked access token, or the app was disconnected or suspended.403insufficient_scope,plan_required(withparamwhen an order type is not in the plan) oraccount_inactive.429rate_limited: more than 120 requests per minute on this connection. WaitRetry-Afterseconds.500server_error. Safe to retry with the same Idempotency-Key.
curl "https://api.flavoso.com/v1/reports/products?from=2026-10-01&to=2026-10-31" \
-H "Authorization: Bearer $ACCESS_TOKEN"{
"object": "list",
"data": [
{
"object": "product_sales",
"product_id": "2d6f8a1c-3e5b-4d7f-9a2c-4e6b8d0f2a46",
"name": "Pizza Margherita",
"quantity": 214,
"gross": 176550
}
],
"has_more": true,
"next_cursor": null
}¿Algo no ha quedado claro? Escribe a support@flavoso.com e indica el identificador de X-Request-Id. Así podremos encontrar tu solicitud en el registro.