API FlavosoRéférence de l'APICommandes

Commandes

Lire, accepter, refuser, annuler et faire avancer les commandes, et les prendre en charge avec votre propre identifiant. Le cycle de vie d'une commande est décrit sous Déroulement des commandes, la reprise dans une caisse sous Intégration caisse.

Points de terminaison

List orders

get/orders

Droit:
orders:read
Offre:
toutes les offres

Without updated_since, the most recently changed orders come first. With updated_since, orders come in ascending updated_at order, which is the way to poll: remember the updated_at of the last order you processed and pass it as the next updated_since, minus a minute of overlap, deduplicating by id + updated_at. Without the overlap, a change committed at the same moment as your previous poll can be missed.

A system that takes over orders can instead ask for acknowledged=false (the orders your app has not acknowledged yet with POST /orders/{id}/acknowledge) and acknowledge each one after booking it.

Unpaid online orders are never listed: they do not exist until the payment is confirmed.

Paramètres

NomEmplacementDescription
statusstringqueryComma-separated statuses: pending, confirmed, preparing, ready, completed, cancelled.
typestringqueryComma-separated order types: pickup, delivery, dine_in.
updated_sincestring (date-time)queryOnly orders changed after this instant (exclusive; ISO 8601 with time zone, write + as %2B in a URL). Switches the order to ascending updated_at. Poll with an overlap (the last updated_at you processed minus a minute) and deduplicate by id + updated_at: a change committed at the same moment as your poll can otherwise be missed.
created_sincestring (date-time)queryOnly orders placed at or after this instant (ISO 8601 with time zone; write + as %2B in a URL).
created_untilstring (date-time)queryOnly orders placed before this instant (exclusive, ISO 8601 with time zone).
paidbooleanquerytrue: only orders paid online. false: only orders paid on site, whose payment status stays open (Flavoso does not record payments on site).
acknowledgedbooleanquerytrue/false: only orders your app has / has not acknowledged (POST /orders/{id}/acknowledge). Other apps' acknowledgements do not count.
external_idstringqueryOnly the order your app acknowledged with this external_id.max 100 chars
limitintegerqueryPage size, 1 to 100. Default 25.1 to 100 · default 25
cursorstringquerynext_cursor of the previous page. Opaque; send the same filters again with it.

Réponse200

OK

  • objectstringobligatoire

    Always list.

    Valeurs:"list"

  • dataOrder[]obligatoire

    The items of this page.

    Champs contenus (20)
    • objectstringobligatoire

      Always order.

      Valeurs:"order"

    • idstring (uuid)obligatoire

      The order.

    • codestringobligatoire

      Short code the guest sees and says at the counter, e.g. K7Q2M9.

    • external_idstringobligatoirepeut être null

      Your app's reference set with POST /orders/{id}/acknowledge; null when none. Always null in webhook events and in GET /events: the envelope is built once and sent the same to every receiver, but this value belongs to a single app. Retrieve the object to see yours.

    • typestringobligatoire

      How the guest gets the order.

      Valeurs:"pickup""delivery""dine_in"

    • sourcestringobligatoire

      Where it was placed: table via a table's QR code, app in the Flavoso app by a signed-in guest, storefront everything else (the restaurant's ordering page, the app without sign-in).

      Valeurs:"storefront""table""app"

    • statusstringobligatoire

      Where the order is now. Restaurants may skip statuses, see GET /store.

      Valeurs:"pending""confirmed""preparing""ready""completed""cancelled"

    • created_atstring (date-time)obligatoire

      When the order was placed. ISO 8601 in UTC (Z).

    • updated_atstring (date-time)obligatoire

      Last change. ISO 8601 in UTC (Z).

    • acknowledged_atstring (date-time)obligatoirepeut être null

      When your app first acknowledged the order (POST /orders/{id}/acknowledge); null when not yet. Always null in webhook events and in GET /events: the envelope is built once and sent the same to every receiver, but this value belongs to a single app. Retrieve the object to see yours.

    • requested_forstring (date-time)obligatoirepeut être null

      Pickup or delivery time chosen by the guest (pre-order); null means as soon as possible.

    • currencystringobligatoire

      ISO 4217, e.g. EUR.

    • amountsobjectobligatoire

      The amounts of the order, in cents.

      Champs contenus (6)
      • subtotalintegerobligatoire

        Sum of the items. Integer amount in the smallest currency unit (cents).

      • delivery_feeintegerobligatoire

        Delivery fee. Integer amount in the smallest currency unit (cents).

      • service_feeintegerobligatoire

        Service fee. Integer amount in the smallest currency unit (cents).

      • discountintegerobligatoire

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

      • tipintegerobligatoire

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

      • totalintegerobligatoire

        subtotal + delivery_fee + service_fee − discount + tip. Integer amount in the smallest currency unit (cents).

    • taxobjectobligatoire

      VAT per rate of total − tip (items, fees, minus discount), computed like the restaurant's accounting export: discounts and delivery fees spread over the rates as the restaurant set it.

      Champs contenus (2)
      • includedbooleanobligatoire

        Always true: prices include VAT.

        Valeurs:true

      • linesTaxLine[]obligatoire

        One line per rate, ascending, lines without rate last. The gross amounts add up to total − tip.

        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.

    • paymentobjectobligatoire

      How and whether it is paid.

      Champs contenus (3)
      • methodstringobligatoire

        online: paid at checkout. on_site: paid at pickup, delivery or the table.

        Valeurs:"online""on_site"

      • statusstringobligatoire

        paid once the online payment is confirmed. open: to be paid on site; it stays open, because Flavoso does not record payments on site.

        Valeurs:"paid""open"

      • paid_atstring (date-time)obligatoirepeut être null

        When it was paid; null while open.

    • customerobjectobligatoirepeut être null

      Only what is needed to hand the order over (data minimisation): no e-mail, and no phone for dine-in. null when neither is known.

      Champs contenus (2)
      • namestringobligatoirepeut être null

        The guest's name.

      • phonestringobligatoirepeut être null

        Phone for questions; null for dine-in.

    • deliveryobjectobligatoirepeut être null

      The delivery address; null unless type is delivery.

      Champs contenus (3)
      • addressstringobligatoirepeut être null

        Street and number.

      • postal_codestringobligatoirepeut être null

        Postal code.

      • citystringobligatoirepeut être null

        City.

    • tableobjectobligatoirepeut être null

      The table of a dine-in order; null otherwise.

      Champs contenus (2)
      • idstring (uuid)obligatoire

        The table (GET /tables).

      • labelstringobligatoirepeut être null

        The table's name, e.g. 4.

    • notestringobligatoirepeut être null

      Guest's note for the kitchen (allergies!).

    • itemsOrderItem[]obligatoire

      The lines.

      Champs contenus (8)
      • idstring (uuid)obligatoire

        The line.

      • product_idstring (uuid)obligatoirepeut être null

        The dish (GET /menu/products/{id}); null when it was deleted since.

      • namestringobligatoire

        Name at the time of ordering.

      • quantityintegerobligatoire

        How many.

        min 1

      • unit_priceintegerobligatoire

        Price of one unit including options. Integer amount in the smallest currency unit (cents).

      • line_totalintegerobligatoire

        unit_price × quantity. Integer amount in the smallest currency unit (cents).

      • tax_rate_bpsintegerobligatoirepeut être null

        VAT rate frozen at order time, in basis points (700 = 7 %). null when the restaurant has not set rates.

      • optionsobject[]obligatoire

        The chosen options (extras, sizes), as ordered. Name, surcharge and group name are frozen at order time; the ids point to the menu (GET /menu/options/{id}) as long as the option exists.

        Champs contenus (5)
        • idstring (uuid)obligatoirepeut être null

          The option (GET /menu/options/{id}); with it you find your own modifier through its external_id. null for orders placed before 8 October 2026.

        • namestringobligatoire

          Name of the option.

        • price_deltaintegerobligatoire

          Surcharge of this option, per unit. Integer amount in the smallest currency unit (cents).

        • group_idstring (uuid)obligatoirepeut être null

          The option group the option was chosen in (GET /menu/option-groups/{id}). null for orders placed before 8 October 2026.

        • group_namestringobligatoirepeut être null

          Name of that group at order time, e.g. Extras or Size. null for orders placed before 8 October 2026.

  • 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/orders" \
  -H "Authorization: Bearer $ACCESS_TOKEN"
Réponse
{
  "object": "list",
  "data": [
    {
      "object": "order",
      "id": "5f1c9b2e-8d4a-4c1e-9f3a-2b7d6e8c1a40",
      "code": "K7Q2M9",
      "external_id": null,
      "type": "pickup",
      "source": "storefront",
      "status": "pending",
      "created_at": "2026-10-09T17:42:11.214Z",
      "updated_at": "2026-10-09T17:42:11.214Z",
      "acknowledged_at": null,
      "requested_for": null,
      "currency": "EUR",
      "amounts": {
        "subtotal": 2350,
        "delivery_fee": 0,
        "service_fee": 0,
        "discount": 0,
        "tip": 100,
        "total": 2450
      },
      "tax": {
        "included": true,
        "lines": [
          {
            "rate_bps": 700,
            "gross": 1650,
            "net": 1542,
            "tax": 108
          },
          {
            "rate_bps": 1900,
            "gross": 700,
            "net": 588,
            "tax": 112
          }
        ]
      },
      "payment": {
        "method": "on_site",
        "status": "open",
        "paid_at": null
      },
      "customer": {
        "name": "Alex",
        "phone": "+49 151 23456789"
      },
      "delivery": null,
      "table": null,
      "note": "No onions, please",
      "items": [
        {
          "id": "e9c0ce66-7f7f-42cf-a4bf-7d66f87768c1",
          "product_id": "2d6f8a1c-3e5b-4d7f-9a2c-4e6b8d0f2a46",
          "name": "Pizza Margherita",
          "quantity": 2,
          "unit_price": 825,
          "line_total": 1650,
          "tax_rate_bps": 700,
          "options": [
            {
              "id": "9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d",
              "name": "Extra cheese",
              "price_delta": 100,
              "group_id": "5e4d3c2b-1a09-4f8e-b7d6-c5b4a3928170",
              "group_name": "Extras"
            }
          ]
        },
        {
          "id": "f1a2b3c4-d5e6-4f70-8a9b-0c1d2e3f4a5b",
          "product_id": "7b9d1f3a-5c7e-4a9b-8d1f-3a5c7e9b1d2f",
          "name": "Cola 0.5 l",
          "quantity": 2,
          "unit_price": 350,
          "line_total": 700,
          "tax_rate_bps": 1900,
          "options": []
        }
      ]
    }
  ],
  "has_more": false,
  "next_cursor": null
}

Retrieve an order

get/orders/{id}

Droit:
orders:read
Offre:
toutes les offres

The order with everything a POS needs for the receipt: items with options, amounts, VAT per rate, payment, the guest's name (and phone for pickup and delivery) and, for delivery, the address. external_id and acknowledged_at are your app's own values.

Paramètres

NomEmplacementDescription
idstring (uuid)obligatoirepathThe order id (UUID).

Réponse200

OK

  • objectstringobligatoire

    Always order.

    Valeurs:"order"

  • idstring (uuid)obligatoire

    The order.

  • codestringobligatoire

    Short code the guest sees and says at the counter, e.g. K7Q2M9.

  • external_idstringobligatoirepeut être null

    Your app's reference set with POST /orders/{id}/acknowledge; null when none. Always null in webhook events and in GET /events: the envelope is built once and sent the same to every receiver, but this value belongs to a single app. Retrieve the object to see yours.

  • typestringobligatoire

    How the guest gets the order.

    Valeurs:"pickup""delivery""dine_in"

  • sourcestringobligatoire

    Where it was placed: table via a table's QR code, app in the Flavoso app by a signed-in guest, storefront everything else (the restaurant's ordering page, the app without sign-in).

    Valeurs:"storefront""table""app"

  • statusstringobligatoire

    Where the order is now. Restaurants may skip statuses, see GET /store.

    Valeurs:"pending""confirmed""preparing""ready""completed""cancelled"

  • created_atstring (date-time)obligatoire

    When the order was placed. ISO 8601 in UTC (Z).

  • updated_atstring (date-time)obligatoire

    Last change. ISO 8601 in UTC (Z).

  • acknowledged_atstring (date-time)obligatoirepeut être null

    When your app first acknowledged the order (POST /orders/{id}/acknowledge); null when not yet. Always null in webhook events and in GET /events: the envelope is built once and sent the same to every receiver, but this value belongs to a single app. Retrieve the object to see yours.

  • requested_forstring (date-time)obligatoirepeut être null

    Pickup or delivery time chosen by the guest (pre-order); null means as soon as possible.

  • currencystringobligatoire

    ISO 4217, e.g. EUR.

  • amountsobjectobligatoire

    The amounts of the order, in cents.

    Champs contenus (6)
    • subtotalintegerobligatoire

      Sum of the items. Integer amount in the smallest currency unit (cents).

    • delivery_feeintegerobligatoire

      Delivery fee. Integer amount in the smallest currency unit (cents).

    • service_feeintegerobligatoire

      Service fee. Integer amount in the smallest currency unit (cents).

    • discountintegerobligatoire

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

    • tipintegerobligatoire

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

    • totalintegerobligatoire

      subtotal + delivery_fee + service_fee − discount + tip. Integer amount in the smallest currency unit (cents).

  • taxobjectobligatoire

    VAT per rate of total − tip (items, fees, minus discount), computed like the restaurant's accounting export: discounts and delivery fees spread over the rates as the restaurant set it.

    Champs contenus (2)
    • includedbooleanobligatoire

      Always true: prices include VAT.

      Valeurs:true

    • linesTaxLine[]obligatoire

      One line per rate, ascending, lines without rate last. The gross amounts add up to total − tip.

      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.

  • paymentobjectobligatoire

    How and whether it is paid.

    Champs contenus (3)
    • methodstringobligatoire

      online: paid at checkout. on_site: paid at pickup, delivery or the table.

      Valeurs:"online""on_site"

    • statusstringobligatoire

      paid once the online payment is confirmed. open: to be paid on site; it stays open, because Flavoso does not record payments on site.

      Valeurs:"paid""open"

    • paid_atstring (date-time)obligatoirepeut être null

      When it was paid; null while open.

  • customerobjectobligatoirepeut être null

    Only what is needed to hand the order over (data minimisation): no e-mail, and no phone for dine-in. null when neither is known.

    Champs contenus (2)
    • namestringobligatoirepeut être null

      The guest's name.

    • phonestringobligatoirepeut être null

      Phone for questions; null for dine-in.

  • deliveryobjectobligatoirepeut être null

    The delivery address; null unless type is delivery.

    Champs contenus (3)
    • addressstringobligatoirepeut être null

      Street and number.

    • postal_codestringobligatoirepeut être null

      Postal code.

    • citystringobligatoirepeut être null

      City.

  • tableobjectobligatoirepeut être null

    The table of a dine-in order; null otherwise.

    Champs contenus (2)
    • idstring (uuid)obligatoire

      The table (GET /tables).

    • labelstringobligatoirepeut être null

      The table's name, e.g. 4.

  • notestringobligatoirepeut être null

    Guest's note for the kitchen (allergies!).

  • itemsOrderItem[]obligatoire

    The lines.

    Champs contenus (8)
    • idstring (uuid)obligatoire

      The line.

    • product_idstring (uuid)obligatoirepeut être null

      The dish (GET /menu/products/{id}); null when it was deleted since.

    • namestringobligatoire

      Name at the time of ordering.

    • quantityintegerobligatoire

      How many.

      min 1

    • unit_priceintegerobligatoire

      Price of one unit including options. Integer amount in the smallest currency unit (cents).

    • line_totalintegerobligatoire

      unit_price × quantity. Integer amount in the smallest currency unit (cents).

    • tax_rate_bpsintegerobligatoirepeut être null

      VAT rate frozen at order time, in basis points (700 = 7 %). null when the restaurant has not set rates.

    • optionsobject[]obligatoire

      The chosen options (extras, sizes), as ordered. Name, surcharge and group name are frozen at order time; the ids point to the menu (GET /menu/options/{id}) as long as the option exists.

      Champs contenus (5)
      • idstring (uuid)obligatoirepeut être null

        The option (GET /menu/options/{id}); with it you find your own modifier through its external_id. null for orders placed before 8 October 2026.

      • namestringobligatoire

        Name of the option.

      • price_deltaintegerobligatoire

        Surcharge of this option, per unit. Integer amount in the smallest currency unit (cents).

      • group_idstring (uuid)obligatoirepeut être null

        The option group the option was chosen in (GET /menu/option-groups/{id}). null for orders placed before 8 October 2026.

      • group_namestringobligatoirepeut être null

        Name of that group at order time, e.g. Extras or Size. null for orders placed before 8 October 2026.

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.
  • 404not_found: no such object in this restaurant (objects of other restaurants are never found).
  • 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/orders/ORDER_ID" \
  -H "Authorization: Bearer $ACCESS_TOKEN"
Réponse
{
  "object": "order",
  "id": "5f1c9b2e-8d4a-4c1e-9f3a-2b7d6e8c1a40",
  "code": "K7Q2M9",
  "external_id": null,
  "type": "pickup",
  "source": "storefront",
  "status": "pending",
  "created_at": "2026-10-09T17:42:11.214Z",
  "updated_at": "2026-10-09T17:42:11.214Z",
  "acknowledged_at": null,
  "requested_for": null,
  "currency": "EUR",
  "amounts": {
    "subtotal": 2350,
    "delivery_fee": 0,
    "service_fee": 0,
    "discount": 0,
    "tip": 100,
    "total": 2450
  },
  "tax": {
    "included": true,
    "lines": [
      {
        "rate_bps": 700,
        "gross": 1650,
        "net": 1542,
        "tax": 108
      },
      {
        "rate_bps": 1900,
        "gross": 700,
        "net": 588,
        "tax": 112
      }
    ]
  },
  "payment": {
    "method": "on_site",
    "status": "open",
    "paid_at": null
  },
  "customer": {
    "name": "Alex",
    "phone": "+49 151 23456789"
  },
  "delivery": null,
  "table": null,
  "note": "No onions, please",
  "items": [
    {
      "id": "e9c0ce66-7f7f-42cf-a4bf-7d66f87768c1",
      "product_id": "2d6f8a1c-3e5b-4d7f-9a2c-4e6b8d0f2a46",
      "name": "Pizza Margherita",
      "quantity": 2,
      "unit_price": 825,
      "line_total": 1650,
      "tax_rate_bps": 700,
      "options": [
        {
          "id": "9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d",
          "name": "Extra cheese",
          "price_delta": 100,
          "group_id": "5e4d3c2b-1a09-4f8e-b7d6-c5b4a3928170",
          "group_name": "Extras"
        }
      ]
    },
    {
      "id": "f1a2b3c4-d5e6-4f70-8a9b-0c1d2e3f4a5b",
      "product_id": "7b9d1f3a-5c7e-4a9b-8d1f-3a5c7e9b1d2f",
      "name": "Cola 0.5 l",
      "quantity": 2,
      "unit_price": 350,
      "line_total": 700,
      "tax_rate_bps": 1900,
      "options": []
    }
  ]
}

Accept an order

post/orders/{id}/accept

Droit:
orders:write
Offre:
toutes les offres

Moves a pending order to the first status this restaurant uses after pending: usually confirmed, preparing or ready when the restaurant switched confirmed off (GET /store lists order_statuses). The guest is notified exactly as if the restaurant had accepted in the dashboard.

An order that is already past pending (accepted elsewhere, or advanced) comes back unchanged with 200, so accepting twice is safe. A completed or cancelled order answers 409 invalid_transition.

Paramètres

NomEmplacementDescription
idstring (uuid)obligatoirepathThe order id (UUID).
Idempotency-KeystringheaderAny unique string up to 255 printable characters. Retrying a POST with the same key returns the first response (header Idempotent-Replayed: true) instead of acting twice; the same key with a different body is 422 idempotency_key_reused. Kept for 24 hours. Answers that ask for a retry (5xx, 409 conflict) are not kept. While the first request runs, a retry gets 409 idempotency_in_progress; a first request that never finished frees the key after 2 minutes.max 255 chars

Réponse200

The order after the change.

  • objectstringobligatoire

    Always order.

    Valeurs:"order"

  • idstring (uuid)obligatoire

    The order.

  • codestringobligatoire

    Short code the guest sees and says at the counter, e.g. K7Q2M9.

  • external_idstringobligatoirepeut être null

    Your app's reference set with POST /orders/{id}/acknowledge; null when none. Always null in webhook events and in GET /events: the envelope is built once and sent the same to every receiver, but this value belongs to a single app. Retrieve the object to see yours.

  • typestringobligatoire

    How the guest gets the order.

    Valeurs:"pickup""delivery""dine_in"

  • sourcestringobligatoire

    Where it was placed: table via a table's QR code, app in the Flavoso app by a signed-in guest, storefront everything else (the restaurant's ordering page, the app without sign-in).

    Valeurs:"storefront""table""app"

  • statusstringobligatoire

    Where the order is now. Restaurants may skip statuses, see GET /store.

    Valeurs:"pending""confirmed""preparing""ready""completed""cancelled"

  • created_atstring (date-time)obligatoire

    When the order was placed. ISO 8601 in UTC (Z).

  • updated_atstring (date-time)obligatoire

    Last change. ISO 8601 in UTC (Z).

  • acknowledged_atstring (date-time)obligatoirepeut être null

    When your app first acknowledged the order (POST /orders/{id}/acknowledge); null when not yet. Always null in webhook events and in GET /events: the envelope is built once and sent the same to every receiver, but this value belongs to a single app. Retrieve the object to see yours.

  • requested_forstring (date-time)obligatoirepeut être null

    Pickup or delivery time chosen by the guest (pre-order); null means as soon as possible.

  • currencystringobligatoire

    ISO 4217, e.g. EUR.

  • amountsobjectobligatoire

    The amounts of the order, in cents.

    Champs contenus (6)
    • subtotalintegerobligatoire

      Sum of the items. Integer amount in the smallest currency unit (cents).

    • delivery_feeintegerobligatoire

      Delivery fee. Integer amount in the smallest currency unit (cents).

    • service_feeintegerobligatoire

      Service fee. Integer amount in the smallest currency unit (cents).

    • discountintegerobligatoire

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

    • tipintegerobligatoire

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

    • totalintegerobligatoire

      subtotal + delivery_fee + service_fee − discount + tip. Integer amount in the smallest currency unit (cents).

  • taxobjectobligatoire

    VAT per rate of total − tip (items, fees, minus discount), computed like the restaurant's accounting export: discounts and delivery fees spread over the rates as the restaurant set it.

    Champs contenus (2)
    • includedbooleanobligatoire

      Always true: prices include VAT.

      Valeurs:true

    • linesTaxLine[]obligatoire

      One line per rate, ascending, lines without rate last. The gross amounts add up to total − tip.

      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.

  • paymentobjectobligatoire

    How and whether it is paid.

    Champs contenus (3)
    • methodstringobligatoire

      online: paid at checkout. on_site: paid at pickup, delivery or the table.

      Valeurs:"online""on_site"

    • statusstringobligatoire

      paid once the online payment is confirmed. open: to be paid on site; it stays open, because Flavoso does not record payments on site.

      Valeurs:"paid""open"

    • paid_atstring (date-time)obligatoirepeut être null

      When it was paid; null while open.

  • customerobjectobligatoirepeut être null

    Only what is needed to hand the order over (data minimisation): no e-mail, and no phone for dine-in. null when neither is known.

    Champs contenus (2)
    • namestringobligatoirepeut être null

      The guest's name.

    • phonestringobligatoirepeut être null

      Phone for questions; null for dine-in.

  • deliveryobjectobligatoirepeut être null

    The delivery address; null unless type is delivery.

    Champs contenus (3)
    • addressstringobligatoirepeut être null

      Street and number.

    • postal_codestringobligatoirepeut être null

      Postal code.

    • citystringobligatoirepeut être null

      City.

  • tableobjectobligatoirepeut être null

    The table of a dine-in order; null otherwise.

    Champs contenus (2)
    • idstring (uuid)obligatoire

      The table (GET /tables).

    • labelstringobligatoirepeut être null

      The table's name, e.g. 4.

  • notestringobligatoirepeut être null

    Guest's note for the kitchen (allergies!).

  • itemsOrderItem[]obligatoire

    The lines.

    Champs contenus (8)
    • idstring (uuid)obligatoire

      The line.

    • product_idstring (uuid)obligatoirepeut être null

      The dish (GET /menu/products/{id}); null when it was deleted since.

    • namestringobligatoire

      Name at the time of ordering.

    • quantityintegerobligatoire

      How many.

      min 1

    • unit_priceintegerobligatoire

      Price of one unit including options. Integer amount in the smallest currency unit (cents).

    • line_totalintegerobligatoire

      unit_price × quantity. Integer amount in the smallest currency unit (cents).

    • tax_rate_bpsintegerobligatoirepeut être null

      VAT rate frozen at order time, in basis points (700 = 7 %). null when the restaurant has not set rates.

    • optionsobject[]obligatoire

      The chosen options (extras, sizes), as ordered. Name, surcharge and group name are frozen at order time; the ids point to the menu (GET /menu/options/{id}) as long as the option exists.

      Champs contenus (5)
      • idstring (uuid)obligatoirepeut être null

        The option (GET /menu/options/{id}); with it you find your own modifier through its external_id. null for orders placed before 8 October 2026.

      • namestringobligatoire

        Name of the option.

      • price_deltaintegerobligatoire

        Surcharge of this option, per unit. Integer amount in the smallest currency unit (cents).

      • group_idstring (uuid)obligatoirepeut être null

        The option group the option was chosen in (GET /menu/option-groups/{id}). null for orders placed before 8 October 2026.

      • group_namestringobligatoirepeut être null

        Name of that group at order time, e.g. Extras or Size. null for orders placed before 8 October 2026.

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.
  • 404not_found: no such object in this restaurant (objects of other restaurants are never found).
  • 409invalid_transition (the status of the object does not allow this), stage_not_used (the restaurant does not use this status), external_id_taken (your app already uses this external_id for another object of the same kind in this restaurant), slot_unavailable (the time or the table is taken), idempotency_in_progress (a request with this Idempotency-Key is still running) or conflict (the same data was changed elsewhere at the same moment, three times in a row; retry unchanged after Retry-After seconds).
  • 413payload_too_large: the body is larger than the operation takes, counted in bytes: 64 KB, 2 MB for PUT /menu. Split the request.
  • 422idempotency_key_reused (the key was used with a different request) or limit_exceeded (too many entries in one request, such as products in PUT /menu, or a limit of the restaurant is reached, such as 60 special days).
  • 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 -X POST "https://api.flavoso.com/v1/orders/ORDER_ID/accept" \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)"
Réponse
{
  "object": "order",
  "id": "5f1c9b2e-8d4a-4c1e-9f3a-2b7d6e8c1a40",
  "code": "K7Q2M9",
  "external_id": null,
  "type": "pickup",
  "source": "storefront",
  "status": "confirmed",
  "created_at": "2026-10-09T17:42:11.214Z",
  "updated_at": "2026-10-09T17:42:11.214Z",
  "acknowledged_at": null,
  "requested_for": null,
  "currency": "EUR",
  "amounts": {
    "subtotal": 2350,
    "delivery_fee": 0,
    "service_fee": 0,
    "discount": 0,
    "tip": 100,
    "total": 2450
  },
  "tax": {
    "included": true,
    "lines": [
      {
        "rate_bps": 700,
        "gross": 1650,
        "net": 1542,
        "tax": 108
      },
      {
        "rate_bps": 1900,
        "gross": 700,
        "net": 588,
        "tax": 112
      }
    ]
  },
  "payment": {
    "method": "on_site",
    "status": "open",
    "paid_at": null
  },
  "customer": {
    "name": "Alex",
    "phone": "+49 151 23456789"
  },
  "delivery": null,
  "table": null,
  "note": "No onions, please",
  "items": [
    {
      "id": "e9c0ce66-7f7f-42cf-a4bf-7d66f87768c1",
      "product_id": "2d6f8a1c-3e5b-4d7f-9a2c-4e6b8d0f2a46",
      "name": "Pizza Margherita",
      "quantity": 2,
      "unit_price": 825,
      "line_total": 1650,
      "tax_rate_bps": 700,
      "options": [
        {
          "id": "9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d",
          "name": "Extra cheese",
          "price_delta": 100,
          "group_id": "5e4d3c2b-1a09-4f8e-b7d6-c5b4a3928170",
          "group_name": "Extras"
        }
      ]
    },
    {
      "id": "f1a2b3c4-d5e6-4f70-8a9b-0c1d2e3f4a5b",
      "product_id": "7b9d1f3a-5c7e-4a9b-8d1f-3a5c7e9b1d2f",
      "name": "Cola 0.5 l",
      "quantity": 2,
      "unit_price": 350,
      "line_total": 700,
      "tax_rate_bps": 1900,
      "options": []
    }
  ]
}

Reject an order

post/orders/{id}/reject

Droit:
orders:write
Offre:
toutes les offres

Cancels an order that has not been accepted yet (pending only). The guest receives the cancellation notice; reason goes into the restaurant's audit log.

Paramètres

NomEmplacementDescription
idstring (uuid)obligatoirepathThe order id (UUID).
Idempotency-KeystringheaderAny unique string up to 255 printable characters. Retrying a POST with the same key returns the first response (header Idempotent-Replayed: true) instead of acting twice; the same key with a different body is 422 idempotency_key_reused. Kept for 24 hours. Answers that ask for a retry (5xx, 409 conflict) are not kept. While the first request runs, a retry gets 409 idempotency_in_progress; a first request that never finished frees the key after 2 minutes.max 255 chars

Corpsapplication/json

  • reasonstring

    Free text for the restaurant's audit log, e.g. 'out of dough', at most 200 characters (longer answers 400 with param). Not shown to the guest.

    max 200 chars

Réponse200

The order after the change.

  • objectstringobligatoire

    Always order.

    Valeurs:"order"

  • idstring (uuid)obligatoire

    The order.

  • codestringobligatoire

    Short code the guest sees and says at the counter, e.g. K7Q2M9.

  • external_idstringobligatoirepeut être null

    Your app's reference set with POST /orders/{id}/acknowledge; null when none. Always null in webhook events and in GET /events: the envelope is built once and sent the same to every receiver, but this value belongs to a single app. Retrieve the object to see yours.

  • typestringobligatoire

    How the guest gets the order.

    Valeurs:"pickup""delivery""dine_in"

  • sourcestringobligatoire

    Where it was placed: table via a table's QR code, app in the Flavoso app by a signed-in guest, storefront everything else (the restaurant's ordering page, the app without sign-in).

    Valeurs:"storefront""table""app"

  • statusstringobligatoire

    Where the order is now. Restaurants may skip statuses, see GET /store.

    Valeurs:"pending""confirmed""preparing""ready""completed""cancelled"

  • created_atstring (date-time)obligatoire

    When the order was placed. ISO 8601 in UTC (Z).

  • updated_atstring (date-time)obligatoire

    Last change. ISO 8601 in UTC (Z).

  • acknowledged_atstring (date-time)obligatoirepeut être null

    When your app first acknowledged the order (POST /orders/{id}/acknowledge); null when not yet. Always null in webhook events and in GET /events: the envelope is built once and sent the same to every receiver, but this value belongs to a single app. Retrieve the object to see yours.

  • requested_forstring (date-time)obligatoirepeut être null

    Pickup or delivery time chosen by the guest (pre-order); null means as soon as possible.

  • currencystringobligatoire

    ISO 4217, e.g. EUR.

  • amountsobjectobligatoire

    The amounts of the order, in cents.

    Champs contenus (6)
    • subtotalintegerobligatoire

      Sum of the items. Integer amount in the smallest currency unit (cents).

    • delivery_feeintegerobligatoire

      Delivery fee. Integer amount in the smallest currency unit (cents).

    • service_feeintegerobligatoire

      Service fee. Integer amount in the smallest currency unit (cents).

    • discountintegerobligatoire

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

    • tipintegerobligatoire

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

    • totalintegerobligatoire

      subtotal + delivery_fee + service_fee − discount + tip. Integer amount in the smallest currency unit (cents).

  • taxobjectobligatoire

    VAT per rate of total − tip (items, fees, minus discount), computed like the restaurant's accounting export: discounts and delivery fees spread over the rates as the restaurant set it.

    Champs contenus (2)
    • includedbooleanobligatoire

      Always true: prices include VAT.

      Valeurs:true

    • linesTaxLine[]obligatoire

      One line per rate, ascending, lines without rate last. The gross amounts add up to total − tip.

      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.

  • paymentobjectobligatoire

    How and whether it is paid.

    Champs contenus (3)
    • methodstringobligatoire

      online: paid at checkout. on_site: paid at pickup, delivery or the table.

      Valeurs:"online""on_site"

    • statusstringobligatoire

      paid once the online payment is confirmed. open: to be paid on site; it stays open, because Flavoso does not record payments on site.

      Valeurs:"paid""open"

    • paid_atstring (date-time)obligatoirepeut être null

      When it was paid; null while open.

  • customerobjectobligatoirepeut être null

    Only what is needed to hand the order over (data minimisation): no e-mail, and no phone for dine-in. null when neither is known.

    Champs contenus (2)
    • namestringobligatoirepeut être null

      The guest's name.

    • phonestringobligatoirepeut être null

      Phone for questions; null for dine-in.

  • deliveryobjectobligatoirepeut être null

    The delivery address; null unless type is delivery.

    Champs contenus (3)
    • addressstringobligatoirepeut être null

      Street and number.

    • postal_codestringobligatoirepeut être null

      Postal code.

    • citystringobligatoirepeut être null

      City.

  • tableobjectobligatoirepeut être null

    The table of a dine-in order; null otherwise.

    Champs contenus (2)
    • idstring (uuid)obligatoire

      The table (GET /tables).

    • labelstringobligatoirepeut être null

      The table's name, e.g. 4.

  • notestringobligatoirepeut être null

    Guest's note for the kitchen (allergies!).

  • itemsOrderItem[]obligatoire

    The lines.

    Champs contenus (8)
    • idstring (uuid)obligatoire

      The line.

    • product_idstring (uuid)obligatoirepeut être null

      The dish (GET /menu/products/{id}); null when it was deleted since.

    • namestringobligatoire

      Name at the time of ordering.

    • quantityintegerobligatoire

      How many.

      min 1

    • unit_priceintegerobligatoire

      Price of one unit including options. Integer amount in the smallest currency unit (cents).

    • line_totalintegerobligatoire

      unit_price × quantity. Integer amount in the smallest currency unit (cents).

    • tax_rate_bpsintegerobligatoirepeut être null

      VAT rate frozen at order time, in basis points (700 = 7 %). null when the restaurant has not set rates.

    • optionsobject[]obligatoire

      The chosen options (extras, sizes), as ordered. Name, surcharge and group name are frozen at order time; the ids point to the menu (GET /menu/options/{id}) as long as the option exists.

      Champs contenus (5)
      • idstring (uuid)obligatoirepeut être null

        The option (GET /menu/options/{id}); with it you find your own modifier through its external_id. null for orders placed before 8 October 2026.

      • namestringobligatoire

        Name of the option.

      • price_deltaintegerobligatoire

        Surcharge of this option, per unit. Integer amount in the smallest currency unit (cents).

      • group_idstring (uuid)obligatoirepeut être null

        The option group the option was chosen in (GET /menu/option-groups/{id}). null for orders placed before 8 October 2026.

      • group_namestringobligatoirepeut être null

        Name of that group at order time, e.g. Extras or Size. null for orders placed before 8 October 2026.

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.
  • 404not_found: no such object in this restaurant (objects of other restaurants are never found).
  • 409invalid_transition (the status of the object does not allow this), stage_not_used (the restaurant does not use this status), external_id_taken (your app already uses this external_id for another object of the same kind in this restaurant), slot_unavailable (the time or the table is taken), idempotency_in_progress (a request with this Idempotency-Key is still running) or conflict (the same data was changed elsewhere at the same moment, three times in a row; retry unchanged after Retry-After seconds).
  • 413payload_too_large: the body is larger than the operation takes, counted in bytes: 64 KB, 2 MB for PUT /menu. Split the request.
  • 422idempotency_key_reused (the key was used with a different request) or limit_exceeded (too many entries in one request, such as products in PUT /menu, or a limit of the restaurant is reached, such as 60 special days).
  • 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 -X POST "https://api.flavoso.com/v1/orders/ORDER_ID/reject" \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
  "reason": "Out of dough"
}'
Exemple: Corps
{
  "reason": "Out of dough"
}
Réponse
{
  "object": "order",
  "id": "5f1c9b2e-8d4a-4c1e-9f3a-2b7d6e8c1a40",
  "code": "K7Q2M9",
  "external_id": null,
  "type": "pickup",
  "source": "storefront",
  "status": "confirmed",
  "created_at": "2026-10-09T17:42:11.214Z",
  "updated_at": "2026-10-09T17:42:11.214Z",
  "acknowledged_at": null,
  "requested_for": null,
  "currency": "EUR",
  "amounts": {
    "subtotal": 2350,
    "delivery_fee": 0,
    "service_fee": 0,
    "discount": 0,
    "tip": 100,
    "total": 2450
  },
  "tax": {
    "included": true,
    "lines": [
      {
        "rate_bps": 700,
        "gross": 1650,
        "net": 1542,
        "tax": 108
      },
      {
        "rate_bps": 1900,
        "gross": 700,
        "net": 588,
        "tax": 112
      }
    ]
  },
  "payment": {
    "method": "on_site",
    "status": "open",
    "paid_at": null
  },
  "customer": {
    "name": "Alex",
    "phone": "+49 151 23456789"
  },
  "delivery": null,
  "table": null,
  "note": "No onions, please",
  "items": [
    {
      "id": "e9c0ce66-7f7f-42cf-a4bf-7d66f87768c1",
      "product_id": "2d6f8a1c-3e5b-4d7f-9a2c-4e6b8d0f2a46",
      "name": "Pizza Margherita",
      "quantity": 2,
      "unit_price": 825,
      "line_total": 1650,
      "tax_rate_bps": 700,
      "options": [
        {
          "id": "9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d",
          "name": "Extra cheese",
          "price_delta": 100,
          "group_id": "5e4d3c2b-1a09-4f8e-b7d6-c5b4a3928170",
          "group_name": "Extras"
        }
      ]
    },
    {
      "id": "f1a2b3c4-d5e6-4f70-8a9b-0c1d2e3f4a5b",
      "product_id": "7b9d1f3a-5c7e-4a9b-8d1f-3a5c7e9b1d2f",
      "name": "Cola 0.5 l",
      "quantity": 2,
      "unit_price": 350,
      "line_total": 700,
      "tax_rate_bps": 1900,
      "options": []
    }
  ]
}

Cancel an order

post/orders/{id}/cancel

Droit:
orders:write
Offre:
toutes les offres

Cancels an order from any open status. Guest and staff are notified, the order leaves the kitchen display.

Paramètres

NomEmplacementDescription
idstring (uuid)obligatoirepathThe order id (UUID).
Idempotency-KeystringheaderAny unique string up to 255 printable characters. Retrying a POST with the same key returns the first response (header Idempotent-Replayed: true) instead of acting twice; the same key with a different body is 422 idempotency_key_reused. Kept for 24 hours. Answers that ask for a retry (5xx, 409 conflict) are not kept. While the first request runs, a retry gets 409 idempotency_in_progress; a first request that never finished frees the key after 2 minutes.max 255 chars

Corpsapplication/json

  • reasonstring

    Free text for the restaurant's audit log, e.g. 'out of dough', at most 200 characters (longer answers 400 with param). Not shown to the guest.

    max 200 chars

Réponse200

The order after the change.

  • objectstringobligatoire

    Always order.

    Valeurs:"order"

  • idstring (uuid)obligatoire

    The order.

  • codestringobligatoire

    Short code the guest sees and says at the counter, e.g. K7Q2M9.

  • external_idstringobligatoirepeut être null

    Your app's reference set with POST /orders/{id}/acknowledge; null when none. Always null in webhook events and in GET /events: the envelope is built once and sent the same to every receiver, but this value belongs to a single app. Retrieve the object to see yours.

  • typestringobligatoire

    How the guest gets the order.

    Valeurs:"pickup""delivery""dine_in"

  • sourcestringobligatoire

    Where it was placed: table via a table's QR code, app in the Flavoso app by a signed-in guest, storefront everything else (the restaurant's ordering page, the app without sign-in).

    Valeurs:"storefront""table""app"

  • statusstringobligatoire

    Where the order is now. Restaurants may skip statuses, see GET /store.

    Valeurs:"pending""confirmed""preparing""ready""completed""cancelled"

  • created_atstring (date-time)obligatoire

    When the order was placed. ISO 8601 in UTC (Z).

  • updated_atstring (date-time)obligatoire

    Last change. ISO 8601 in UTC (Z).

  • acknowledged_atstring (date-time)obligatoirepeut être null

    When your app first acknowledged the order (POST /orders/{id}/acknowledge); null when not yet. Always null in webhook events and in GET /events: the envelope is built once and sent the same to every receiver, but this value belongs to a single app. Retrieve the object to see yours.

  • requested_forstring (date-time)obligatoirepeut être null

    Pickup or delivery time chosen by the guest (pre-order); null means as soon as possible.

  • currencystringobligatoire

    ISO 4217, e.g. EUR.

  • amountsobjectobligatoire

    The amounts of the order, in cents.

    Champs contenus (6)
    • subtotalintegerobligatoire

      Sum of the items. Integer amount in the smallest currency unit (cents).

    • delivery_feeintegerobligatoire

      Delivery fee. Integer amount in the smallest currency unit (cents).

    • service_feeintegerobligatoire

      Service fee. Integer amount in the smallest currency unit (cents).

    • discountintegerobligatoire

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

    • tipintegerobligatoire

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

    • totalintegerobligatoire

      subtotal + delivery_fee + service_fee − discount + tip. Integer amount in the smallest currency unit (cents).

  • taxobjectobligatoire

    VAT per rate of total − tip (items, fees, minus discount), computed like the restaurant's accounting export: discounts and delivery fees spread over the rates as the restaurant set it.

    Champs contenus (2)
    • includedbooleanobligatoire

      Always true: prices include VAT.

      Valeurs:true

    • linesTaxLine[]obligatoire

      One line per rate, ascending, lines without rate last. The gross amounts add up to total − tip.

      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.

  • paymentobjectobligatoire

    How and whether it is paid.

    Champs contenus (3)
    • methodstringobligatoire

      online: paid at checkout. on_site: paid at pickup, delivery or the table.

      Valeurs:"online""on_site"

    • statusstringobligatoire

      paid once the online payment is confirmed. open: to be paid on site; it stays open, because Flavoso does not record payments on site.

      Valeurs:"paid""open"

    • paid_atstring (date-time)obligatoirepeut être null

      When it was paid; null while open.

  • customerobjectobligatoirepeut être null

    Only what is needed to hand the order over (data minimisation): no e-mail, and no phone for dine-in. null when neither is known.

    Champs contenus (2)
    • namestringobligatoirepeut être null

      The guest's name.

    • phonestringobligatoirepeut être null

      Phone for questions; null for dine-in.

  • deliveryobjectobligatoirepeut être null

    The delivery address; null unless type is delivery.

    Champs contenus (3)
    • addressstringobligatoirepeut être null

      Street and number.

    • postal_codestringobligatoirepeut être null

      Postal code.

    • citystringobligatoirepeut être null

      City.

  • tableobjectobligatoirepeut être null

    The table of a dine-in order; null otherwise.

    Champs contenus (2)
    • idstring (uuid)obligatoire

      The table (GET /tables).

    • labelstringobligatoirepeut être null

      The table's name, e.g. 4.

  • notestringobligatoirepeut être null

    Guest's note for the kitchen (allergies!).

  • itemsOrderItem[]obligatoire

    The lines.

    Champs contenus (8)
    • idstring (uuid)obligatoire

      The line.

    • product_idstring (uuid)obligatoirepeut être null

      The dish (GET /menu/products/{id}); null when it was deleted since.

    • namestringobligatoire

      Name at the time of ordering.

    • quantityintegerobligatoire

      How many.

      min 1

    • unit_priceintegerobligatoire

      Price of one unit including options. Integer amount in the smallest currency unit (cents).

    • line_totalintegerobligatoire

      unit_price × quantity. Integer amount in the smallest currency unit (cents).

    • tax_rate_bpsintegerobligatoirepeut être null

      VAT rate frozen at order time, in basis points (700 = 7 %). null when the restaurant has not set rates.

    • optionsobject[]obligatoire

      The chosen options (extras, sizes), as ordered. Name, surcharge and group name are frozen at order time; the ids point to the menu (GET /menu/options/{id}) as long as the option exists.

      Champs contenus (5)
      • idstring (uuid)obligatoirepeut être null

        The option (GET /menu/options/{id}); with it you find your own modifier through its external_id. null for orders placed before 8 October 2026.

      • namestringobligatoire

        Name of the option.

      • price_deltaintegerobligatoire

        Surcharge of this option, per unit. Integer amount in the smallest currency unit (cents).

      • group_idstring (uuid)obligatoirepeut être null

        The option group the option was chosen in (GET /menu/option-groups/{id}). null for orders placed before 8 October 2026.

      • group_namestringobligatoirepeut être null

        Name of that group at order time, e.g. Extras or Size. null for orders placed before 8 October 2026.

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.
  • 404not_found: no such object in this restaurant (objects of other restaurants are never found).
  • 409invalid_transition (the status of the object does not allow this), stage_not_used (the restaurant does not use this status), external_id_taken (your app already uses this external_id for another object of the same kind in this restaurant), slot_unavailable (the time or the table is taken), idempotency_in_progress (a request with this Idempotency-Key is still running) or conflict (the same data was changed elsewhere at the same moment, three times in a row; retry unchanged after Retry-After seconds).
  • 413payload_too_large: the body is larger than the operation takes, counted in bytes: 64 KB, 2 MB for PUT /menu. Split the request.
  • 422idempotency_key_reused (the key was used with a different request) or limit_exceeded (too many entries in one request, such as products in PUT /menu, or a limit of the restaurant is reached, such as 60 special days).
  • 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 -X POST "https://api.flavoso.com/v1/orders/ORDER_ID/cancel" \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
  "reason": "Out of dough"
}'
Exemple: Corps
{
  "reason": "Out of dough"
}
Réponse
{
  "object": "order",
  "id": "5f1c9b2e-8d4a-4c1e-9f3a-2b7d6e8c1a40",
  "code": "K7Q2M9",
  "external_id": null,
  "type": "pickup",
  "source": "storefront",
  "status": "confirmed",
  "created_at": "2026-10-09T17:42:11.214Z",
  "updated_at": "2026-10-09T17:42:11.214Z",
  "acknowledged_at": null,
  "requested_for": null,
  "currency": "EUR",
  "amounts": {
    "subtotal": 2350,
    "delivery_fee": 0,
    "service_fee": 0,
    "discount": 0,
    "tip": 100,
    "total": 2450
  },
  "tax": {
    "included": true,
    "lines": [
      {
        "rate_bps": 700,
        "gross": 1650,
        "net": 1542,
        "tax": 108
      },
      {
        "rate_bps": 1900,
        "gross": 700,
        "net": 588,
        "tax": 112
      }
    ]
  },
  "payment": {
    "method": "on_site",
    "status": "open",
    "paid_at": null
  },
  "customer": {
    "name": "Alex",
    "phone": "+49 151 23456789"
  },
  "delivery": null,
  "table": null,
  "note": "No onions, please",
  "items": [
    {
      "id": "e9c0ce66-7f7f-42cf-a4bf-7d66f87768c1",
      "product_id": "2d6f8a1c-3e5b-4d7f-9a2c-4e6b8d0f2a46",
      "name": "Pizza Margherita",
      "quantity": 2,
      "unit_price": 825,
      "line_total": 1650,
      "tax_rate_bps": 700,
      "options": [
        {
          "id": "9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d",
          "name": "Extra cheese",
          "price_delta": 100,
          "group_id": "5e4d3c2b-1a09-4f8e-b7d6-c5b4a3928170",
          "group_name": "Extras"
        }
      ]
    },
    {
      "id": "f1a2b3c4-d5e6-4f70-8a9b-0c1d2e3f4a5b",
      "product_id": "7b9d1f3a-5c7e-4a9b-8d1f-3a5c7e9b1d2f",
      "name": "Cola 0.5 l",
      "quantity": 2,
      "unit_price": 350,
      "line_total": 700,
      "tax_rate_bps": 1900,
      "options": []
    }
  ]
}

Advance an order

post/orders/{id}/status

Droit:
orders:write
Offre:
toutes les offres

Moves an order forward to confirmed, preparing, ready or completed. Skipping ahead is allowed (confirmed → ready), moving back is not (invalid_transition). Setting the current status again returns the order unchanged.

Restaurants can switch statuses off. A status this restaurant does not use returns stage_not_used; GET /store lists order_statuses.

For delivery orders, ready means ready for the driver and completed means delivered.

Paramètres

NomEmplacementDescription
idstring (uuid)obligatoirepathThe order id (UUID).
Idempotency-KeystringheaderAny unique string up to 255 printable characters. Retrying a POST with the same key returns the first response (header Idempotent-Replayed: true) instead of acting twice; the same key with a different body is 422 idempotency_key_reused. Kept for 24 hours. Answers that ask for a retry (5xx, 409 conflict) are not kept. While the first request runs, a retry gets 409 idempotency_in_progress; a first request that never finished frees the key after 2 minutes.max 255 chars

Corpsapplication/json

  • statusstringobligatoire

    The status to move to. Use /cancel to cancel.

    Valeurs:"confirmed""preparing""ready""completed"

Réponse200

The order after the change.

  • objectstringobligatoire

    Always order.

    Valeurs:"order"

  • idstring (uuid)obligatoire

    The order.

  • codestringobligatoire

    Short code the guest sees and says at the counter, e.g. K7Q2M9.

  • external_idstringobligatoirepeut être null

    Your app's reference set with POST /orders/{id}/acknowledge; null when none. Always null in webhook events and in GET /events: the envelope is built once and sent the same to every receiver, but this value belongs to a single app. Retrieve the object to see yours.

  • typestringobligatoire

    How the guest gets the order.

    Valeurs:"pickup""delivery""dine_in"

  • sourcestringobligatoire

    Where it was placed: table via a table's QR code, app in the Flavoso app by a signed-in guest, storefront everything else (the restaurant's ordering page, the app without sign-in).

    Valeurs:"storefront""table""app"

  • statusstringobligatoire

    Where the order is now. Restaurants may skip statuses, see GET /store.

    Valeurs:"pending""confirmed""preparing""ready""completed""cancelled"

  • created_atstring (date-time)obligatoire

    When the order was placed. ISO 8601 in UTC (Z).

  • updated_atstring (date-time)obligatoire

    Last change. ISO 8601 in UTC (Z).

  • acknowledged_atstring (date-time)obligatoirepeut être null

    When your app first acknowledged the order (POST /orders/{id}/acknowledge); null when not yet. Always null in webhook events and in GET /events: the envelope is built once and sent the same to every receiver, but this value belongs to a single app. Retrieve the object to see yours.

  • requested_forstring (date-time)obligatoirepeut être null

    Pickup or delivery time chosen by the guest (pre-order); null means as soon as possible.

  • currencystringobligatoire

    ISO 4217, e.g. EUR.

  • amountsobjectobligatoire

    The amounts of the order, in cents.

    Champs contenus (6)
    • subtotalintegerobligatoire

      Sum of the items. Integer amount in the smallest currency unit (cents).

    • delivery_feeintegerobligatoire

      Delivery fee. Integer amount in the smallest currency unit (cents).

    • service_feeintegerobligatoire

      Service fee. Integer amount in the smallest currency unit (cents).

    • discountintegerobligatoire

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

    • tipintegerobligatoire

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

    • totalintegerobligatoire

      subtotal + delivery_fee + service_fee − discount + tip. Integer amount in the smallest currency unit (cents).

  • taxobjectobligatoire

    VAT per rate of total − tip (items, fees, minus discount), computed like the restaurant's accounting export: discounts and delivery fees spread over the rates as the restaurant set it.

    Champs contenus (2)
    • includedbooleanobligatoire

      Always true: prices include VAT.

      Valeurs:true

    • linesTaxLine[]obligatoire

      One line per rate, ascending, lines without rate last. The gross amounts add up to total − tip.

      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.

  • paymentobjectobligatoire

    How and whether it is paid.

    Champs contenus (3)
    • methodstringobligatoire

      online: paid at checkout. on_site: paid at pickup, delivery or the table.

      Valeurs:"online""on_site"

    • statusstringobligatoire

      paid once the online payment is confirmed. open: to be paid on site; it stays open, because Flavoso does not record payments on site.

      Valeurs:"paid""open"

    • paid_atstring (date-time)obligatoirepeut être null

      When it was paid; null while open.

  • customerobjectobligatoirepeut être null

    Only what is needed to hand the order over (data minimisation): no e-mail, and no phone for dine-in. null when neither is known.

    Champs contenus (2)
    • namestringobligatoirepeut être null

      The guest's name.

    • phonestringobligatoirepeut être null

      Phone for questions; null for dine-in.

  • deliveryobjectobligatoirepeut être null

    The delivery address; null unless type is delivery.

    Champs contenus (3)
    • addressstringobligatoirepeut être null

      Street and number.

    • postal_codestringobligatoirepeut être null

      Postal code.

    • citystringobligatoirepeut être null

      City.

  • tableobjectobligatoirepeut être null

    The table of a dine-in order; null otherwise.

    Champs contenus (2)
    • idstring (uuid)obligatoire

      The table (GET /tables).

    • labelstringobligatoirepeut être null

      The table's name, e.g. 4.

  • notestringobligatoirepeut être null

    Guest's note for the kitchen (allergies!).

  • itemsOrderItem[]obligatoire

    The lines.

    Champs contenus (8)
    • idstring (uuid)obligatoire

      The line.

    • product_idstring (uuid)obligatoirepeut être null

      The dish (GET /menu/products/{id}); null when it was deleted since.

    • namestringobligatoire

      Name at the time of ordering.

    • quantityintegerobligatoire

      How many.

      min 1

    • unit_priceintegerobligatoire

      Price of one unit including options. Integer amount in the smallest currency unit (cents).

    • line_totalintegerobligatoire

      unit_price × quantity. Integer amount in the smallest currency unit (cents).

    • tax_rate_bpsintegerobligatoirepeut être null

      VAT rate frozen at order time, in basis points (700 = 7 %). null when the restaurant has not set rates.

    • optionsobject[]obligatoire

      The chosen options (extras, sizes), as ordered. Name, surcharge and group name are frozen at order time; the ids point to the menu (GET /menu/options/{id}) as long as the option exists.

      Champs contenus (5)
      • idstring (uuid)obligatoirepeut être null

        The option (GET /menu/options/{id}); with it you find your own modifier through its external_id. null for orders placed before 8 October 2026.

      • namestringobligatoire

        Name of the option.

      • price_deltaintegerobligatoire

        Surcharge of this option, per unit. Integer amount in the smallest currency unit (cents).

      • group_idstring (uuid)obligatoirepeut être null

        The option group the option was chosen in (GET /menu/option-groups/{id}). null for orders placed before 8 October 2026.

      • group_namestringobligatoirepeut être null

        Name of that group at order time, e.g. Extras or Size. null for orders placed before 8 October 2026.

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.
  • 404not_found: no such object in this restaurant (objects of other restaurants are never found).
  • 409invalid_transition (the status of the object does not allow this), stage_not_used (the restaurant does not use this status), external_id_taken (your app already uses this external_id for another object of the same kind in this restaurant), slot_unavailable (the time or the table is taken), idempotency_in_progress (a request with this Idempotency-Key is still running) or conflict (the same data was changed elsewhere at the same moment, three times in a row; retry unchanged after Retry-After seconds).
  • 413payload_too_large: the body is larger than the operation takes, counted in bytes: 64 KB, 2 MB for PUT /menu. Split the request.
  • 422idempotency_key_reused (the key was used with a different request) or limit_exceeded (too many entries in one request, such as products in PUT /menu, or a limit of the restaurant is reached, such as 60 special days).
  • 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 -X POST "https://api.flavoso.com/v1/orders/ORDER_ID/status" \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
  "status": "preparing"
}'
Exemple: Corps
{
  "status": "preparing"
}
Réponse
{
  "object": "order",
  "id": "5f1c9b2e-8d4a-4c1e-9f3a-2b7d6e8c1a40",
  "code": "K7Q2M9",
  "external_id": null,
  "type": "pickup",
  "source": "storefront",
  "status": "confirmed",
  "created_at": "2026-10-09T17:42:11.214Z",
  "updated_at": "2026-10-09T17:42:11.214Z",
  "acknowledged_at": null,
  "requested_for": null,
  "currency": "EUR",
  "amounts": {
    "subtotal": 2350,
    "delivery_fee": 0,
    "service_fee": 0,
    "discount": 0,
    "tip": 100,
    "total": 2450
  },
  "tax": {
    "included": true,
    "lines": [
      {
        "rate_bps": 700,
        "gross": 1650,
        "net": 1542,
        "tax": 108
      },
      {
        "rate_bps": 1900,
        "gross": 700,
        "net": 588,
        "tax": 112
      }
    ]
  },
  "payment": {
    "method": "on_site",
    "status": "open",
    "paid_at": null
  },
  "customer": {
    "name": "Alex",
    "phone": "+49 151 23456789"
  },
  "delivery": null,
  "table": null,
  "note": "No onions, please",
  "items": [
    {
      "id": "e9c0ce66-7f7f-42cf-a4bf-7d66f87768c1",
      "product_id": "2d6f8a1c-3e5b-4d7f-9a2c-4e6b8d0f2a46",
      "name": "Pizza Margherita",
      "quantity": 2,
      "unit_price": 825,
      "line_total": 1650,
      "tax_rate_bps": 700,
      "options": [
        {
          "id": "9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d",
          "name": "Extra cheese",
          "price_delta": 100,
          "group_id": "5e4d3c2b-1a09-4f8e-b7d6-c5b4a3928170",
          "group_name": "Extras"
        }
      ]
    },
    {
      "id": "f1a2b3c4-d5e6-4f70-8a9b-0c1d2e3f4a5b",
      "product_id": "7b9d1f3a-5c7e-4a9b-8d1f-3a5c7e9b1d2f",
      "name": "Cola 0.5 l",
      "quantity": 2,
      "unit_price": 350,
      "line_total": 700,
      "tax_rate_bps": 1900,
      "options": []
    }
  ]
}

Acknowledge an order

post/orders/{id}/acknowledge

Droit:
orders:write
Offre:
toutes les offres

Tells Flavoso your app has taken over the order (booked it into the POS, printed it), optionally with your own reference (external_id, e.g. the receipt number). The first call sets acknowledged_at; later calls keep it and only change external_id (send null to remove it). Safe to repeat.

Both values belong to your app: another app connected to the same restaurant sees its own. Find orders you have not taken over yet with GET /orders?acknowledged=false.

Does not change the order's status; use /accept for that. An external_id your app already uses for another order of this restaurant answers 409 external_id_taken.

Paramètres

NomEmplacementDescription
idstring (uuid)obligatoirepathThe order id (UUID).
Idempotency-KeystringheaderAny unique string up to 255 printable characters. Retrying a POST with the same key returns the first response (header Idempotent-Replayed: true) instead of acting twice; the same key with a different body is 422 idempotency_key_reused. Kept for 24 hours. Answers that ask for a retry (5xx, 409 conflict) are not kept. While the first request runs, a retry gets 409 idempotency_in_progress; a first request that never finished frees the key after 2 minutes.max 255 chars

Corpsapplication/json

  • external_idstringpeut être null

    Your reference for this order, 1 to 100 printable characters, unique per app and restaurant. null removes it; omit it to keep the current one.

    1 to 100 chars

Réponse200

The order with your external_id and acknowledged_at.

  • objectstringobligatoire

    Always order.

    Valeurs:"order"

  • idstring (uuid)obligatoire

    The order.

  • codestringobligatoire

    Short code the guest sees and says at the counter, e.g. K7Q2M9.

  • external_idstringobligatoirepeut être null

    Your app's reference set with POST /orders/{id}/acknowledge; null when none. Always null in webhook events and in GET /events: the envelope is built once and sent the same to every receiver, but this value belongs to a single app. Retrieve the object to see yours.

  • typestringobligatoire

    How the guest gets the order.

    Valeurs:"pickup""delivery""dine_in"

  • sourcestringobligatoire

    Where it was placed: table via a table's QR code, app in the Flavoso app by a signed-in guest, storefront everything else (the restaurant's ordering page, the app without sign-in).

    Valeurs:"storefront""table""app"

  • statusstringobligatoire

    Where the order is now. Restaurants may skip statuses, see GET /store.

    Valeurs:"pending""confirmed""preparing""ready""completed""cancelled"

  • created_atstring (date-time)obligatoire

    When the order was placed. ISO 8601 in UTC (Z).

  • updated_atstring (date-time)obligatoire

    Last change. ISO 8601 in UTC (Z).

  • acknowledged_atstring (date-time)obligatoirepeut être null

    When your app first acknowledged the order (POST /orders/{id}/acknowledge); null when not yet. Always null in webhook events and in GET /events: the envelope is built once and sent the same to every receiver, but this value belongs to a single app. Retrieve the object to see yours.

  • requested_forstring (date-time)obligatoirepeut être null

    Pickup or delivery time chosen by the guest (pre-order); null means as soon as possible.

  • currencystringobligatoire

    ISO 4217, e.g. EUR.

  • amountsobjectobligatoire

    The amounts of the order, in cents.

    Champs contenus (6)
    • subtotalintegerobligatoire

      Sum of the items. Integer amount in the smallest currency unit (cents).

    • delivery_feeintegerobligatoire

      Delivery fee. Integer amount in the smallest currency unit (cents).

    • service_feeintegerobligatoire

      Service fee. Integer amount in the smallest currency unit (cents).

    • discountintegerobligatoire

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

    • tipintegerobligatoire

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

    • totalintegerobligatoire

      subtotal + delivery_fee + service_fee − discount + tip. Integer amount in the smallest currency unit (cents).

  • taxobjectobligatoire

    VAT per rate of total − tip (items, fees, minus discount), computed like the restaurant's accounting export: discounts and delivery fees spread over the rates as the restaurant set it.

    Champs contenus (2)
    • includedbooleanobligatoire

      Always true: prices include VAT.

      Valeurs:true

    • linesTaxLine[]obligatoire

      One line per rate, ascending, lines without rate last. The gross amounts add up to total − tip.

      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.

  • paymentobjectobligatoire

    How and whether it is paid.

    Champs contenus (3)
    • methodstringobligatoire

      online: paid at checkout. on_site: paid at pickup, delivery or the table.

      Valeurs:"online""on_site"

    • statusstringobligatoire

      paid once the online payment is confirmed. open: to be paid on site; it stays open, because Flavoso does not record payments on site.

      Valeurs:"paid""open"

    • paid_atstring (date-time)obligatoirepeut être null

      When it was paid; null while open.

  • customerobjectobligatoirepeut être null

    Only what is needed to hand the order over (data minimisation): no e-mail, and no phone for dine-in. null when neither is known.

    Champs contenus (2)
    • namestringobligatoirepeut être null

      The guest's name.

    • phonestringobligatoirepeut être null

      Phone for questions; null for dine-in.

  • deliveryobjectobligatoirepeut être null

    The delivery address; null unless type is delivery.

    Champs contenus (3)
    • addressstringobligatoirepeut être null

      Street and number.

    • postal_codestringobligatoirepeut être null

      Postal code.

    • citystringobligatoirepeut être null

      City.

  • tableobjectobligatoirepeut être null

    The table of a dine-in order; null otherwise.

    Champs contenus (2)
    • idstring (uuid)obligatoire

      The table (GET /tables).

    • labelstringobligatoirepeut être null

      The table's name, e.g. 4.

  • notestringobligatoirepeut être null

    Guest's note for the kitchen (allergies!).

  • itemsOrderItem[]obligatoire

    The lines.

    Champs contenus (8)
    • idstring (uuid)obligatoire

      The line.

    • product_idstring (uuid)obligatoirepeut être null

      The dish (GET /menu/products/{id}); null when it was deleted since.

    • namestringobligatoire

      Name at the time of ordering.

    • quantityintegerobligatoire

      How many.

      min 1

    • unit_priceintegerobligatoire

      Price of one unit including options. Integer amount in the smallest currency unit (cents).

    • line_totalintegerobligatoire

      unit_price × quantity. Integer amount in the smallest currency unit (cents).

    • tax_rate_bpsintegerobligatoirepeut être null

      VAT rate frozen at order time, in basis points (700 = 7 %). null when the restaurant has not set rates.

    • optionsobject[]obligatoire

      The chosen options (extras, sizes), as ordered. Name, surcharge and group name are frozen at order time; the ids point to the menu (GET /menu/options/{id}) as long as the option exists.

      Champs contenus (5)
      • idstring (uuid)obligatoirepeut être null

        The option (GET /menu/options/{id}); with it you find your own modifier through its external_id. null for orders placed before 8 October 2026.

      • namestringobligatoire

        Name of the option.

      • price_deltaintegerobligatoire

        Surcharge of this option, per unit. Integer amount in the smallest currency unit (cents).

      • group_idstring (uuid)obligatoirepeut être null

        The option group the option was chosen in (GET /menu/option-groups/{id}). null for orders placed before 8 October 2026.

      • group_namestringobligatoirepeut être null

        Name of that group at order time, e.g. Extras or Size. null for orders placed before 8 October 2026.

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.
  • 404not_found: no such object in this restaurant (objects of other restaurants are never found).
  • 409invalid_transition (the status of the object does not allow this), stage_not_used (the restaurant does not use this status), external_id_taken (your app already uses this external_id for another object of the same kind in this restaurant), slot_unavailable (the time or the table is taken), idempotency_in_progress (a request with this Idempotency-Key is still running) or conflict (the same data was changed elsewhere at the same moment, three times in a row; retry unchanged after Retry-After seconds).
  • 413payload_too_large: the body is larger than the operation takes, counted in bytes: 64 KB, 2 MB for PUT /menu. Split the request.
  • 422idempotency_key_reused (the key was used with a different request) or limit_exceeded (too many entries in one request, such as products in PUT /menu, or a limit of the restaurant is reached, such as 60 special days).
  • 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 -X POST "https://api.flavoso.com/v1/orders/ORDER_ID/acknowledge" \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
  "external_id": "BON-2026-004711"
}'
Exemple: Corps
{
  "external_id": "BON-2026-004711"
}
Réponse
{
  "object": "order",
  "id": "5f1c9b2e-8d4a-4c1e-9f3a-2b7d6e8c1a40",
  "code": "K7Q2M9",
  "external_id": "BON-2026-004711",
  "type": "pickup",
  "source": "storefront",
  "status": "pending",
  "created_at": "2026-10-09T17:42:11.214Z",
  "updated_at": "2026-10-09T17:42:11.214Z",
  "acknowledged_at": "2026-10-09T17:42:15.902Z",
  "requested_for": null,
  "currency": "EUR",
  "amounts": {
    "subtotal": 2350,
    "delivery_fee": 0,
    "service_fee": 0,
    "discount": 0,
    "tip": 100,
    "total": 2450
  },
  "tax": {
    "included": true,
    "lines": [
      {
        "rate_bps": 700,
        "gross": 1650,
        "net": 1542,
        "tax": 108
      },
      {
        "rate_bps": 1900,
        "gross": 700,
        "net": 588,
        "tax": 112
      }
    ]
  },
  "payment": {
    "method": "on_site",
    "status": "open",
    "paid_at": null
  },
  "customer": {
    "name": "Alex",
    "phone": "+49 151 23456789"
  },
  "delivery": null,
  "table": null,
  "note": "No onions, please",
  "items": [
    {
      "id": "e9c0ce66-7f7f-42cf-a4bf-7d66f87768c1",
      "product_id": "2d6f8a1c-3e5b-4d7f-9a2c-4e6b8d0f2a46",
      "name": "Pizza Margherita",
      "quantity": 2,
      "unit_price": 825,
      "line_total": 1650,
      "tax_rate_bps": 700,
      "options": [
        {
          "id": "9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d",
          "name": "Extra cheese",
          "price_delta": 100,
          "group_id": "5e4d3c2b-1a09-4f8e-b7d6-c5b4a3928170",
          "group_name": "Extras"
        }
      ]
    },
    {
      "id": "f1a2b3c4-d5e6-4f70-8a9b-0c1d2e3f4a5b",
      "product_id": "7b9d1f3a-5c7e-4a9b-8d1f-3a5c7e9b1d2f",
      "name": "Cola 0.5 l",
      "quantity": 2,
      "unit_price": 350,
      "line_total": 700,
      "tax_rate_bps": 1900,
      "options": []
    }
  ]
}

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.