API FlavosoRéférence de l'APIRapports

Rapports

Chiffre d'affaires par jour, semaine ou mois et ventes par plat, selon les mêmes règles que les chiffres du tableau de bord. Plus de détails sous Rapports.

Points de terminaison

Sales report

get/reports/sales

Droit:
reports:read
Offre:
toutes les offres

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.

Paramètres

NomEmplacementDescription
fromstring (date)obligatoirequeryFirst day of the report, a local date of the restaurant (YYYY-MM-DD). Included.
tostring (date)obligatoirequeryLast day of the report, a local date (YYYY-MM-DD). Included. At most 366 days after from.
group_bystringqueryday (default), week, month or total. Periods at the edges are cut to from and to."day""week""month""total"default "day"

Réponse200

OK

  • objectstringobligatoire

    Always sales_report.

    Valeurs:"sales_report"

  • currencystringobligatoire

    ISO 4217 of all amounts.

  • timezonestringobligatoire

    The time zone the days are counted in.

  • fromstring (date)obligatoire

    First day, included. A date YYYY-MM-DD in the restaurant's time zone.

  • tostring (date)obligatoire

    Last day, included. A date YYYY-MM-DD in the restaurant's time zone.

  • group_bystringobligatoire

    The period of each bucket.

    Valeurs:"day""week""month""total"

  • totalsSalesBucketobligatoire

    The whole period.

    Champs contenus (14)
    • period_startstring (date)obligatoire

      First day of the period (cut to from). A date YYYY-MM-DD in the restaurant's time zone.

    • period_endstring (date)obligatoire

      Last day of the period (cut to to), included. A date YYYY-MM-DD in the restaurant's time zone.

    • ordersintegerobligatoire

      Counted orders (not cancelled; online ones only when paid).

    • grossintegerobligatoire

      What guests paid without tips: items, delivery and service fees, minus discounts. Integer amount in the smallest currency unit (cents).

    • netintegerobligatoire

      gross − tax. Integer amount in the smallest currency unit (cents).

    • taxintegerobligatoire

      VAT contained in gross, computed per day, payment method and rate. Integer amount in the smallest currency unit (cents).

    • tipsintegerobligatoire

      Tips (pass-through, not revenue). Integer amount in the smallest currency unit (cents).

    • delivery_feesintegerobligatoire

      Delivery fees, included in gross. Integer amount in the smallest currency unit (cents).

    • service_feesintegerobligatoire

      Service fees, included in gross. Integer amount in the smallest currency unit (cents).

    • discountsintegerobligatoire

      Discounts (stamp card), already subtracted from gross. Integer amount in the smallest currency unit (cents).

    • by_tax_rateTaxLine[]obligatoire

      gross, net and tax per rate; rate_bps null for amounts without a stored rate.

      Champs contenus (4)
      • rate_bpsintegerobligatoirepeut être null

        The 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.

      • grossintegerobligatoire

        Gross amount at this rate. Integer amount in the smallest currency unit (cents).

      • netintegerobligatoirepeut être null

        gross − tax, in cents. null when rate_bps is null.

      • taxintegerobligatoirepeut être null

        VAT contained in gross: round(gross × rate / (10000 + rate)), in cents. null when rate_bps is null.

    • by_payment_methodobjectobligatoire

      Split by payment method.

      Champs contenus (2)
      • onlinePaymentSplitobligatoire

        Orders, gross (without tips) and tips of one part.

        Champs contenus (3)
        • ordersintegerobligatoire

          Counted orders.

        • grossintegerobligatoire

          Gross without tips. Integer amount in the smallest currency unit (cents).

        • tipsintegerobligatoire

          Tips. Integer amount in the smallest currency unit (cents).

      • on_sitePaymentSplitobligatoire

        Orders, gross (without tips) and tips of one part.

        Champs contenus (3)
        • ordersintegerobligatoire

          Counted orders.

        • grossintegerobligatoire

          Gross without tips. Integer amount in the smallest currency unit (cents).

        • tipsintegerobligatoire

          Tips. Integer amount in the smallest currency unit (cents).

    • by_typeobjectobligatoire

      Split by order type.

      Champs contenus (3)
      • pickupPaymentSplitobligatoire

        Orders, gross (without tips) and tips of one part.

        Champs contenus (3)
        • ordersintegerobligatoire

          Counted orders.

        • grossintegerobligatoire

          Gross without tips. Integer amount in the smallest currency unit (cents).

        • tipsintegerobligatoire

          Tips. Integer amount in the smallest currency unit (cents).

      • deliveryPaymentSplitobligatoire

        Orders, gross (without tips) and tips of one part.

        Champs contenus (3)
        • ordersintegerobligatoire

          Counted orders.

        • grossintegerobligatoire

          Gross without tips. Integer amount in the smallest currency unit (cents).

        • tipsintegerobligatoire

          Tips. Integer amount in the smallest currency unit (cents).

      • dine_inPaymentSplitobligatoire

        Orders, gross (without tips) and tips of one part.

        Champs contenus (3)
        • ordersintegerobligatoire

          Counted orders.

        • grossintegerobligatoire

          Gross without tips. Integer amount in the smallest currency unit (cents).

        • tipsintegerobligatoire

          Tips. Integer amount in the smallest currency unit (cents).

    • cancelledobjectobligatoire

      Orders placed (and paid, if online) and later cancelled; not part of the figures above.

      Champs contenus (2)
      • ordersintegerobligatoire

        How many.

      • grossintegerobligatoire

        Their totals. Integer amount in the smallest currency unit (cents).

  • bucketsSalesBucket[]obligatoire

    Every period of the range, also those without orders.

    Champs contenus (14)
    • period_startstring (date)obligatoire

      First day of the period (cut to from). A date YYYY-MM-DD in the restaurant's time zone.

    • period_endstring (date)obligatoire

      Last day of the period (cut to to), included. A date YYYY-MM-DD in the restaurant's time zone.

    • ordersintegerobligatoire

      Counted orders (not cancelled; online ones only when paid).

    • grossintegerobligatoire

      What guests paid without tips: items, delivery and service fees, minus discounts. Integer amount in the smallest currency unit (cents).

    • netintegerobligatoire

      gross − tax. Integer amount in the smallest currency unit (cents).

    • taxintegerobligatoire

      VAT contained in gross, computed per day, payment method and rate. Integer amount in the smallest currency unit (cents).

    • tipsintegerobligatoire

      Tips (pass-through, not revenue). Integer amount in the smallest currency unit (cents).

    • delivery_feesintegerobligatoire

      Delivery fees, included in gross. Integer amount in the smallest currency unit (cents).

    • service_feesintegerobligatoire

      Service fees, included in gross. Integer amount in the smallest currency unit (cents).

    • discountsintegerobligatoire

      Discounts (stamp card), already subtracted from gross. Integer amount in the smallest currency unit (cents).

    • by_tax_rateTaxLine[]obligatoire

      gross, net and tax per rate; rate_bps null for amounts without a stored rate.

      Champs contenus (4)
      • rate_bpsintegerobligatoirepeut être null

        The 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.

      • grossintegerobligatoire

        Gross amount at this rate. Integer amount in the smallest currency unit (cents).

      • netintegerobligatoirepeut être null

        gross − tax, in cents. null when rate_bps is null.

      • taxintegerobligatoirepeut être null

        VAT contained in gross: round(gross × rate / (10000 + rate)), in cents. null when rate_bps is null.

    • by_payment_methodobjectobligatoire

      Split by payment method.

      Champs contenus (2)
      • onlinePaymentSplitobligatoire

        Orders, gross (without tips) and tips of one part.

        Champs contenus (3)
        • ordersintegerobligatoire

          Counted orders.

        • grossintegerobligatoire

          Gross without tips. Integer amount in the smallest currency unit (cents).

        • tipsintegerobligatoire

          Tips. Integer amount in the smallest currency unit (cents).

      • on_sitePaymentSplitobligatoire

        Orders, gross (without tips) and tips of one part.

        Champs contenus (3)
        • ordersintegerobligatoire

          Counted orders.

        • grossintegerobligatoire

          Gross without tips. Integer amount in the smallest currency unit (cents).

        • tipsintegerobligatoire

          Tips. Integer amount in the smallest currency unit (cents).

    • by_typeobjectobligatoire

      Split by order type.

      Champs contenus (3)
      • pickupPaymentSplitobligatoire

        Orders, gross (without tips) and tips of one part.

        Champs contenus (3)
        • ordersintegerobligatoire

          Counted orders.

        • grossintegerobligatoire

          Gross without tips. Integer amount in the smallest currency unit (cents).

        • tipsintegerobligatoire

          Tips. Integer amount in the smallest currency unit (cents).

      • deliveryPaymentSplitobligatoire

        Orders, gross (without tips) and tips of one part.

        Champs contenus (3)
        • ordersintegerobligatoire

          Counted orders.

        • grossintegerobligatoire

          Gross without tips. Integer amount in the smallest currency unit (cents).

        • tipsintegerobligatoire

          Tips. Integer amount in the smallest currency unit (cents).

      • dine_inPaymentSplitobligatoire

        Orders, gross (without tips) and tips of one part.

        Champs contenus (3)
        • ordersintegerobligatoire

          Counted orders.

        • grossintegerobligatoire

          Gross without tips. Integer amount in the smallest currency unit (cents).

        • tipsintegerobligatoire

          Tips. Integer amount in the smallest currency unit (cents).

    • cancelledobjectobligatoire

      Orders placed (and paid, if online) and later cancelled; not part of the figures above.

      Champs contenus (2)
      • ordersintegerobligatoire

        How many.

      • grossintegerobligatoire

        Their totals. Integer amount in the smallest currency unit (cents).

Erreurs

  • 400invalid_request: a parameter or the body is wrong, or it contains a query parameter or field the operation does not know. param names the field.
  • 401unauthorized: missing, malformed, expired or revoked access token, or the app was disconnected or suspended.
  • 403insufficient_scope, plan_required (with param when an order type is not in the plan) or account_inactive.
  • 429rate_limited: more than 120 requests per minute on this connection. Wait Retry-After seconds.
  • 500server_error. Safe to retry with the same Idempotency-Key.

Tous les codes d'erreur

Requête
curl "https://api.flavoso.com/v1/reports/sales?from=2026-10-01&to=2026-10-31" \
  -H "Authorization: Bearer $ACCESS_TOKEN"
Réponse
{
  "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

Droit:
reports:read
Offre:
toutes les offres

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.

Paramètres

NomEmplacementDescription
fromstring (date)obligatoirequeryFirst day of the report, a local date of the restaurant (YYYY-MM-DD). Included.
tostring (date)obligatoirequeryLast day of the report, a local date (YYYY-MM-DD). Included. At most 366 days after from.
limitintegerqueryHow many dishes, 1 to 100. Default 25.1 to 100 · default 25

Réponse200

OK

  • objectstringobligatoire

    Always list.

    Valeurs:"list"

  • dataProductSales[]obligatoire

    The items of this page.

    Champs contenus (5)
    • objectstringobligatoire

      Always product_sales.

      Valeurs:"product_sales"

    • product_idstring (uuid)obligatoirepeut être null

      The dish; null when it was deleted from the menu.

    • namestringobligatoire

      The dish's latest name in the period.

    • quantityintegerobligatoire

      Units sold.

    • grossintegerobligatoire

      Sum of its order lines (incl. options, before order discounts). Integer amount in the smallest currency unit (cents).

  • has_morebooleanobligatoire

    Whether another page follows.

  • next_cursorstringobligatoirepeut être null

    Pass as cursor (with the same filters) to get the next page; null on the last page.

Erreurs

  • 400invalid_request: a parameter or the body is wrong, or it contains a query parameter or field the operation does not know. param names the field.
  • 401unauthorized: missing, malformed, expired or revoked access token, or the app was disconnected or suspended.
  • 403insufficient_scope, plan_required (with param when an order type is not in the plan) or account_inactive.
  • 429rate_limited: more than 120 requests per minute on this connection. Wait Retry-After seconds.
  • 500server_error. Safe to retry with the same Idempotency-Key.

Tous les codes d'erreur

Requête
curl "https://api.flavoso.com/v1/reports/products?from=2026-10-01&to=2026-10-31" \
  -H "Authorization: Bearer $ACCESS_TOKEN"
Réponse
{
  "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
}

Une question reste ouverte ? Écrivez à support@flavoso.com en indiquant l'identifiant de X-Request-Id. Il nous permet de retrouver votre requête dans le journal.