API de FlavosoWebhooks y eventosTipos de eventos
Tipos de eventos
Cada tipo de evento con su descripción, el permiso necesario, los campos en data y un sobre de ejemplo.
Visión general
Un evento se produce exactamente una vez por cambio, sin importar si ocurrió en el panel, en la pantalla de cocina, en la app móvil, en la impresora de tickets o a través de la API. Qué tipos recibe tu app lo eliges en la consola; en GET /events, con types.
Tu programa debe ignorar los tipos que no conozca.
| Eventos | Permiso necesario |
|---|---|
order.* | orders:read |
reservation.* | reservations:read |
menu.* | menu:read |
store.* | store:read |
app.* | ninguno, solo la propia conexión |
Pedidos
order.created
Ha llegado un pedido nuevo: de inmediato con pago en el local, con pago online en cuanto se confirma el pago. Exactamente una vez por pedido.
Permiso necesario: orders:read
Campos en data
objectOrderobligatorioThe order when the event was first read. Values that belong to a single app (
external_id,acknowledged_at) are always null in events: the envelope is built once and sent the same to every receiver. Retrieve the object to see yours.Campos anidados (20)
objectstringobligatorioAlways
order.Valores:
"order"idstring (uuid)obligatorioThe order.
codestringobligatorioShort code the guest sees and says at the counter, e.g. K7Q2M9.
external_idstringobligatoriopuede ser nullYour app's reference set with
POST /orders/{id}/acknowledge; null when none. Always null in webhook events and inGET /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.typestringobligatorioHow the guest gets the order.
Valores:
"pickup""delivery""dine_in"sourcestringobligatorioWhere it was placed:
tablevia a table's QR code,appin the Flavoso app by a signed-in guest,storefronteverything else (the restaurant's ordering page, the app without sign-in).Valores:
"storefront""table""app"statusstringobligatorioWhere the order is now. Restaurants may skip statuses, see
GET /store.Valores:
"pending""confirmed""preparing""ready""completed""cancelled"created_atstring (date-time)obligatorioWhen the order was placed. ISO 8601 in UTC (
Z).updated_atstring (date-time)obligatorioLast change. ISO 8601 in UTC (
Z).acknowledged_atstring (date-time)obligatoriopuede ser nullWhen your app first acknowledged the order (
POST /orders/{id}/acknowledge); null when not yet. Always null in webhook events and inGET /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)obligatoriopuede ser nullPickup or delivery time chosen by the guest (pre-order); null means as soon as possible.
currencystringobligatorioISO 4217, e.g. EUR.
amountsobjectobligatorioThe amounts of the order, in cents.
Campos anidados (6)
subtotalintegerobligatorioSum of the items. Integer amount in the smallest currency unit (cents).
delivery_feeintegerobligatorioDelivery fee. Integer amount in the smallest currency unit (cents).
service_feeintegerobligatorioService fee. Integer amount in the smallest currency unit (cents).
discountintegerobligatorioDiscount (stamp card), already subtracted. Integer amount in the smallest currency unit (cents).
tipintegerobligatorioTip. Pass-through, not revenue. Integer amount in the smallest currency unit (cents).
totalintegerobligatoriosubtotal + delivery_fee + service_fee − discount + tip. Integer amount in the smallest currency unit (cents).
taxobjectobligatorioVAT 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.Campos anidados (2)
includedbooleanobligatorioAlways true: prices include VAT.
Valores:
truelinesTaxLine[]obligatorioOne line per rate, ascending, lines without rate last. The gross amounts add up to total − tip.
Campos anidados (4)
rate_bpsintegerobligatoriopuede ser nullThe rate in basis points (700 = 7 %). null: no rate was stored for this part (not the same as 0 %); then net and tax are null.
grossintegerobligatorioGross amount at this rate. Integer amount in the smallest currency unit (cents).
netintegerobligatoriopuede ser nullgross − tax, in cents. null when rate_bps is null.
taxintegerobligatoriopuede ser nullVAT contained in gross: round(gross × rate / (10000 + rate)), in cents. null when rate_bps is null.
paymentobjectobligatorioHow and whether it is paid.
Campos anidados (3)
methodstringobligatorioonline: paid at checkout.on_site: paid at pickup, delivery or the table.Valores:
"online""on_site"statusstringobligatoriopaidonce the online payment is confirmed.open: to be paid on site; it staysopen, because Flavoso does not record payments on site.Valores:
"paid""open"paid_atstring (date-time)obligatoriopuede ser nullWhen it was paid; null while open.
customerobjectobligatoriopuede ser nullOnly what is needed to hand the order over (data minimisation): no e-mail, and no phone for dine-in. null when neither is known.
Campos anidados (2)
namestringobligatoriopuede ser nullThe guest's name.
phonestringobligatoriopuede ser nullPhone for questions; null for dine-in.
deliveryobjectobligatoriopuede ser nullThe delivery address; null unless type is delivery.
Campos anidados (3)
addressstringobligatoriopuede ser nullStreet and number.
postal_codestringobligatoriopuede ser nullPostal code.
citystringobligatoriopuede ser nullCity.
tableobjectobligatoriopuede ser nullThe table of a dine-in order; null otherwise.
Campos anidados (2)
idstring (uuid)obligatorioThe table (
GET /tables).labelstringobligatoriopuede ser nullThe table's name, e.g. 4.
notestringobligatoriopuede ser nullGuest's note for the kitchen (allergies!).
itemsOrderItem[]obligatorioThe lines.
Campos anidados (8)
idstring (uuid)obligatorioThe line.
product_idstring (uuid)obligatoriopuede ser nullThe dish (
GET /menu/products/{id}); null when it was deleted since.namestringobligatorioName at the time of ordering.
quantityintegerobligatorioHow many.
min 1
unit_priceintegerobligatorioPrice of one unit including options. Integer amount in the smallest currency unit (cents).
line_totalintegerobligatoriounit_price × quantity. Integer amount in the smallest currency unit (cents).
tax_rate_bpsintegerobligatoriopuede ser nullVAT rate frozen at order time, in basis points (700 = 7 %). null when the restaurant has not set rates.
optionsobject[]obligatorioThe 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.Campos anidados (5)
idstring (uuid)obligatoriopuede ser nullThe option (
GET /menu/options/{id}); with it you find your own modifier through itsexternal_id. null for orders placed before 8 October 2026.namestringobligatorioName of the option.
price_deltaintegerobligatorioSurcharge of this option, per unit. Integer amount in the smallest currency unit (cents).
group_idstring (uuid)obligatoriopuede ser nullThe option group the option was chosen in (
GET /menu/option-groups/{id}). null for orders placed before 8 October 2026.group_namestringobligatoriopuede ser nullName of that group at order time, e.g. Extras or Size. null for orders placed before 8 October 2026.
{
"id": "evt_2bf5a9b06b75442a9244e884a1acfc57",
"object": "event",
"type": "order.created",
"created_at": "2026-10-04T17:46:12.410Z",
"api_version": "2026-10-08",
"livemode": true,
"tenant_id": "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa",
"connection_id": "4b3f7c1e-9a2d-4e8b-b5f6-0c1d2e3f4a5b",
"data": {
"object": {
"object": "order",
"id": "37386ae0-ca76-4d50-a738-6ae0ca766d50",
"code": "K7Q2M9",
"external_id": "ART-1001",
"type": "pickup",
"source": "storefront",
"status": "pending",
"created_at": "2026-10-04T17:44:59.942Z",
"updated_at": "2026-10-04T17:44:59.942Z",
"acknowledged_at": "2026-10-04T17:44:59.942Z",
"requested_for": "2026-10-04T17:44:59.942Z",
"currency": "EUR",
"amounts": {
"subtotal": 1290,
"delivery_fee": 1290,
"service_fee": 1290,
"discount": 1290,
"tip": 1290,
"total": 1290
},
"tax": {
"included": true,
"lines": [
{
"rate_bps": 700,
"gross": 1290,
"net": 1290,
"tax": 1290
}
]
},
"payment": {
"method": "online",
"status": "paid",
"paid_at": "2026-10-04T17:44:59.942Z"
},
"customer": {
"name": "string",
"phone": "string"
},
"delivery": {
"address": "string",
"postal_code": "string",
"city": "string"
},
"table": {
"id": "37386ae0-ca76-4d50-a738-6ae0ca766d50",
"label": "string"
},
"note": "string",
"items": [
{
"id": "37386ae0-ca76-4d50-a738-6ae0ca766d50",
"product_id": "6818680c-4376-47b0-a818-680c4376d7b0",
"name": "string",
"quantity": 1,
"unit_price": 1290,
"line_total": 1290,
"tax_rate_bps": 700,
"options": [
{
"id": "37386ae0-ca76-4d50-a738-6ae0ca766d50",
"name": "string",
"price_delta": 1290,
"group_id": "9594642c-e6ef-49ac-a594-642ce6efc9ac",
"group_name": "string"
}
]
}
]
}
}
}order.status_changed
Un pedido ha cambiado de estado, sin importar dónde: panel, pantalla de cocina, app móvil, impresora de tickets o API. previous_status indica el anterior.
Permiso necesario: orders:read
Campos en data
objectOrderobligatorioAn order. Guest data is limited to what is needed to hand it over: the name, the phone for pickup and delivery, the address for delivery, never an e-mail.
Campos anidados (20)
objectstringobligatorioAlways
order.Valores:
"order"idstring (uuid)obligatorioThe order.
codestringobligatorioShort code the guest sees and says at the counter, e.g. K7Q2M9.
external_idstringobligatoriopuede ser nullYour app's reference set with
POST /orders/{id}/acknowledge; null when none. Always null in webhook events and inGET /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.typestringobligatorioHow the guest gets the order.
Valores:
"pickup""delivery""dine_in"sourcestringobligatorioWhere it was placed:
tablevia a table's QR code,appin the Flavoso app by a signed-in guest,storefronteverything else (the restaurant's ordering page, the app without sign-in).Valores:
"storefront""table""app"statusstringobligatorioWhere the order is now. Restaurants may skip statuses, see
GET /store.Valores:
"pending""confirmed""preparing""ready""completed""cancelled"created_atstring (date-time)obligatorioWhen the order was placed. ISO 8601 in UTC (
Z).updated_atstring (date-time)obligatorioLast change. ISO 8601 in UTC (
Z).acknowledged_atstring (date-time)obligatoriopuede ser nullWhen your app first acknowledged the order (
POST /orders/{id}/acknowledge); null when not yet. Always null in webhook events and inGET /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)obligatoriopuede ser nullPickup or delivery time chosen by the guest (pre-order); null means as soon as possible.
currencystringobligatorioISO 4217, e.g. EUR.
amountsobjectobligatorioThe amounts of the order, in cents.
Campos anidados (6)
subtotalintegerobligatorioSum of the items. Integer amount in the smallest currency unit (cents).
delivery_feeintegerobligatorioDelivery fee. Integer amount in the smallest currency unit (cents).
service_feeintegerobligatorioService fee. Integer amount in the smallest currency unit (cents).
discountintegerobligatorioDiscount (stamp card), already subtracted. Integer amount in the smallest currency unit (cents).
tipintegerobligatorioTip. Pass-through, not revenue. Integer amount in the smallest currency unit (cents).
totalintegerobligatoriosubtotal + delivery_fee + service_fee − discount + tip. Integer amount in the smallest currency unit (cents).
taxobjectobligatorioVAT 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.Campos anidados (2)
includedbooleanobligatorioAlways true: prices include VAT.
Valores:
truelinesTaxLine[]obligatorioOne line per rate, ascending, lines without rate last. The gross amounts add up to total − tip.
Campos anidados (4)
rate_bpsintegerobligatoriopuede ser nullThe rate in basis points (700 = 7 %). null: no rate was stored for this part (not the same as 0 %); then net and tax are null.
grossintegerobligatorioGross amount at this rate. Integer amount in the smallest currency unit (cents).
netintegerobligatoriopuede ser nullgross − tax, in cents. null when rate_bps is null.
taxintegerobligatoriopuede ser nullVAT contained in gross: round(gross × rate / (10000 + rate)), in cents. null when rate_bps is null.
paymentobjectobligatorioHow and whether it is paid.
Campos anidados (3)
methodstringobligatorioonline: paid at checkout.on_site: paid at pickup, delivery or the table.Valores:
"online""on_site"statusstringobligatoriopaidonce the online payment is confirmed.open: to be paid on site; it staysopen, because Flavoso does not record payments on site.Valores:
"paid""open"paid_atstring (date-time)obligatoriopuede ser nullWhen it was paid; null while open.
customerobjectobligatoriopuede ser nullOnly what is needed to hand the order over (data minimisation): no e-mail, and no phone for dine-in. null when neither is known.
Campos anidados (2)
namestringobligatoriopuede ser nullThe guest's name.
phonestringobligatoriopuede ser nullPhone for questions; null for dine-in.
deliveryobjectobligatoriopuede ser nullThe delivery address; null unless type is delivery.
Campos anidados (3)
addressstringobligatoriopuede ser nullStreet and number.
postal_codestringobligatoriopuede ser nullPostal code.
citystringobligatoriopuede ser nullCity.
tableobjectobligatoriopuede ser nullThe table of a dine-in order; null otherwise.
Campos anidados (2)
idstring (uuid)obligatorioThe table (
GET /tables).labelstringobligatoriopuede ser nullThe table's name, e.g. 4.
notestringobligatoriopuede ser nullGuest's note for the kitchen (allergies!).
itemsOrderItem[]obligatorioThe lines.
Campos anidados (8)
idstring (uuid)obligatorioThe line.
product_idstring (uuid)obligatoriopuede ser nullThe dish (
GET /menu/products/{id}); null when it was deleted since.namestringobligatorioName at the time of ordering.
quantityintegerobligatorioHow many.
min 1
unit_priceintegerobligatorioPrice of one unit including options. Integer amount in the smallest currency unit (cents).
line_totalintegerobligatoriounit_price × quantity. Integer amount in the smallest currency unit (cents).
tax_rate_bpsintegerobligatoriopuede ser nullVAT rate frozen at order time, in basis points (700 = 7 %). null when the restaurant has not set rates.
optionsobject[]obligatorioThe 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.Campos anidados (5)
idstring (uuid)obligatoriopuede ser nullThe option (
GET /menu/options/{id}); with it you find your own modifier through itsexternal_id. null for orders placed before 8 October 2026.namestringobligatorioName of the option.
price_deltaintegerobligatorioSurcharge of this option, per unit. Integer amount in the smallest currency unit (cents).
group_idstring (uuid)obligatoriopuede ser nullThe option group the option was chosen in (
GET /menu/option-groups/{id}). null for orders placed before 8 October 2026.group_namestringobligatoriopuede ser nullName of that group at order time, e.g. Extras or Size. null for orders placed before 8 October 2026.
previous_statusstringobligatorioThe status before this change.
{
"id": "evt_2bf5a9b06b75442a9244e884a1acfc57",
"object": "event",
"type": "order.status_changed",
"created_at": "2026-10-04T17:46:12.410Z",
"api_version": "2026-10-08",
"livemode": true,
"tenant_id": "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa",
"connection_id": "4b3f7c1e-9a2d-4e8b-b5f6-0c1d2e3f4a5b",
"data": {
"object": {
"object": "order",
"id": "37386ae0-ca76-4d50-a738-6ae0ca766d50",
"code": "K7Q2M9",
"external_id": "ART-1001",
"type": "pickup",
"source": "storefront",
"status": "pending",
"created_at": "2026-10-04T17:44:59.942Z",
"updated_at": "2026-10-04T17:44:59.942Z",
"acknowledged_at": "2026-10-04T17:44:59.942Z",
"requested_for": "2026-10-04T17:44:59.942Z",
"currency": "EUR",
"amounts": {
"subtotal": 1290,
"delivery_fee": 1290,
"service_fee": 1290,
"discount": 1290,
"tip": 1290,
"total": 1290
},
"tax": {
"included": true,
"lines": [
{
"rate_bps": 700,
"gross": 1290,
"net": 1290,
"tax": 1290
}
]
},
"payment": {
"method": "online",
"status": "paid",
"paid_at": "2026-10-04T17:44:59.942Z"
},
"customer": {
"name": "string",
"phone": "string"
},
"delivery": {
"address": "string",
"postal_code": "string",
"city": "string"
},
"table": {
"id": "37386ae0-ca76-4d50-a738-6ae0ca766d50",
"label": "string"
},
"note": "string",
"items": [
{
"id": "37386ae0-ca76-4d50-a738-6ae0ca766d50",
"product_id": "6818680c-4376-47b0-a818-680c4376d7b0",
"name": "string",
"quantity": 1,
"unit_price": 1290,
"line_total": 1290,
"tax_rate_bps": 700,
"options": [
{
"id": "37386ae0-ca76-4d50-a738-6ae0ca766d50",
"name": "string",
"price_delta": 1290,
"group_id": "9594642c-e6ef-49ac-a594-642ce6efc9ac",
"group_name": "string"
}
]
}
]
},
"previous_status": "string"
}
}order.cancelled
Un pedido se ha cancelado o rechazado. Llega además de order.status_changed.
Permiso necesario: orders:read
Campos en data
objectOrderobligatorioAn order. Guest data is limited to what is needed to hand it over: the name, the phone for pickup and delivery, the address for delivery, never an e-mail.
Campos anidados (20)
objectstringobligatorioAlways
order.Valores:
"order"idstring (uuid)obligatorioThe order.
codestringobligatorioShort code the guest sees and says at the counter, e.g. K7Q2M9.
external_idstringobligatoriopuede ser nullYour app's reference set with
POST /orders/{id}/acknowledge; null when none. Always null in webhook events and inGET /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.typestringobligatorioHow the guest gets the order.
Valores:
"pickup""delivery""dine_in"sourcestringobligatorioWhere it was placed:
tablevia a table's QR code,appin the Flavoso app by a signed-in guest,storefronteverything else (the restaurant's ordering page, the app without sign-in).Valores:
"storefront""table""app"statusstringobligatorioWhere the order is now. Restaurants may skip statuses, see
GET /store.Valores:
"pending""confirmed""preparing""ready""completed""cancelled"created_atstring (date-time)obligatorioWhen the order was placed. ISO 8601 in UTC (
Z).updated_atstring (date-time)obligatorioLast change. ISO 8601 in UTC (
Z).acknowledged_atstring (date-time)obligatoriopuede ser nullWhen your app first acknowledged the order (
POST /orders/{id}/acknowledge); null when not yet. Always null in webhook events and inGET /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)obligatoriopuede ser nullPickup or delivery time chosen by the guest (pre-order); null means as soon as possible.
currencystringobligatorioISO 4217, e.g. EUR.
amountsobjectobligatorioThe amounts of the order, in cents.
Campos anidados (6)
subtotalintegerobligatorioSum of the items. Integer amount in the smallest currency unit (cents).
delivery_feeintegerobligatorioDelivery fee. Integer amount in the smallest currency unit (cents).
service_feeintegerobligatorioService fee. Integer amount in the smallest currency unit (cents).
discountintegerobligatorioDiscount (stamp card), already subtracted. Integer amount in the smallest currency unit (cents).
tipintegerobligatorioTip. Pass-through, not revenue. Integer amount in the smallest currency unit (cents).
totalintegerobligatoriosubtotal + delivery_fee + service_fee − discount + tip. Integer amount in the smallest currency unit (cents).
taxobjectobligatorioVAT 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.Campos anidados (2)
includedbooleanobligatorioAlways true: prices include VAT.
Valores:
truelinesTaxLine[]obligatorioOne line per rate, ascending, lines without rate last. The gross amounts add up to total − tip.
Campos anidados (4)
rate_bpsintegerobligatoriopuede ser nullThe rate in basis points (700 = 7 %). null: no rate was stored for this part (not the same as 0 %); then net and tax are null.
grossintegerobligatorioGross amount at this rate. Integer amount in the smallest currency unit (cents).
netintegerobligatoriopuede ser nullgross − tax, in cents. null when rate_bps is null.
taxintegerobligatoriopuede ser nullVAT contained in gross: round(gross × rate / (10000 + rate)), in cents. null when rate_bps is null.
paymentobjectobligatorioHow and whether it is paid.
Campos anidados (3)
methodstringobligatorioonline: paid at checkout.on_site: paid at pickup, delivery or the table.Valores:
"online""on_site"statusstringobligatoriopaidonce the online payment is confirmed.open: to be paid on site; it staysopen, because Flavoso does not record payments on site.Valores:
"paid""open"paid_atstring (date-time)obligatoriopuede ser nullWhen it was paid; null while open.
customerobjectobligatoriopuede ser nullOnly what is needed to hand the order over (data minimisation): no e-mail, and no phone for dine-in. null when neither is known.
Campos anidados (2)
namestringobligatoriopuede ser nullThe guest's name.
phonestringobligatoriopuede ser nullPhone for questions; null for dine-in.
deliveryobjectobligatoriopuede ser nullThe delivery address; null unless type is delivery.
Campos anidados (3)
addressstringobligatoriopuede ser nullStreet and number.
postal_codestringobligatoriopuede ser nullPostal code.
citystringobligatoriopuede ser nullCity.
tableobjectobligatoriopuede ser nullThe table of a dine-in order; null otherwise.
Campos anidados (2)
idstring (uuid)obligatorioThe table (
GET /tables).labelstringobligatoriopuede ser nullThe table's name, e.g. 4.
notestringobligatoriopuede ser nullGuest's note for the kitchen (allergies!).
itemsOrderItem[]obligatorioThe lines.
Campos anidados (8)
idstring (uuid)obligatorioThe line.
product_idstring (uuid)obligatoriopuede ser nullThe dish (
GET /menu/products/{id}); null when it was deleted since.namestringobligatorioName at the time of ordering.
quantityintegerobligatorioHow many.
min 1
unit_priceintegerobligatorioPrice of one unit including options. Integer amount in the smallest currency unit (cents).
line_totalintegerobligatoriounit_price × quantity. Integer amount in the smallest currency unit (cents).
tax_rate_bpsintegerobligatoriopuede ser nullVAT rate frozen at order time, in basis points (700 = 7 %). null when the restaurant has not set rates.
optionsobject[]obligatorioThe 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.Campos anidados (5)
idstring (uuid)obligatoriopuede ser nullThe option (
GET /menu/options/{id}); with it you find your own modifier through itsexternal_id. null for orders placed before 8 October 2026.namestringobligatorioName of the option.
price_deltaintegerobligatorioSurcharge of this option, per unit. Integer amount in the smallest currency unit (cents).
group_idstring (uuid)obligatoriopuede ser nullThe option group the option was chosen in (
GET /menu/option-groups/{id}). null for orders placed before 8 October 2026.group_namestringobligatoriopuede ser nullName of that group at order time, e.g. Extras or Size. null for orders placed before 8 October 2026.
previous_statusstringobligatorioThe status before the cancellation.
{
"id": "evt_2bf5a9b06b75442a9244e884a1acfc57",
"object": "event",
"type": "order.cancelled",
"created_at": "2026-10-04T17:46:12.410Z",
"api_version": "2026-10-08",
"livemode": true,
"tenant_id": "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa",
"connection_id": "4b3f7c1e-9a2d-4e8b-b5f6-0c1d2e3f4a5b",
"data": {
"object": {
"object": "order",
"id": "37386ae0-ca76-4d50-a738-6ae0ca766d50",
"code": "K7Q2M9",
"external_id": "ART-1001",
"type": "pickup",
"source": "storefront",
"status": "pending",
"created_at": "2026-10-04T17:44:59.942Z",
"updated_at": "2026-10-04T17:44:59.942Z",
"acknowledged_at": "2026-10-04T17:44:59.942Z",
"requested_for": "2026-10-04T17:44:59.942Z",
"currency": "EUR",
"amounts": {
"subtotal": 1290,
"delivery_fee": 1290,
"service_fee": 1290,
"discount": 1290,
"tip": 1290,
"total": 1290
},
"tax": {
"included": true,
"lines": [
{
"rate_bps": 700,
"gross": 1290,
"net": 1290,
"tax": 1290
}
]
},
"payment": {
"method": "online",
"status": "paid",
"paid_at": "2026-10-04T17:44:59.942Z"
},
"customer": {
"name": "string",
"phone": "string"
},
"delivery": {
"address": "string",
"postal_code": "string",
"city": "string"
},
"table": {
"id": "37386ae0-ca76-4d50-a738-6ae0ca766d50",
"label": "string"
},
"note": "string",
"items": [
{
"id": "37386ae0-ca76-4d50-a738-6ae0ca766d50",
"product_id": "6818680c-4376-47b0-a818-680c4376d7b0",
"name": "string",
"quantity": 1,
"unit_price": 1290,
"line_total": 1290,
"tax_rate_bps": 700,
"options": [
{
"id": "37386ae0-ca76-4d50-a738-6ae0ca766d50",
"name": "string",
"price_delta": 1290,
"group_id": "9594642c-e6ef-49ac-a594-642ce6efc9ac",
"group_name": "string"
}
]
}
]
},
"previous_status": "string"
}
}order.paid
Un pedido se ha pagado online: el proveedor de pagos ha confirmado el pago y el pedido existe a partir de ese momento (justo después de order.created). Los pedidos pagados en el local no se registran como pagados en Flavoso y nunca generan este evento.
Permiso necesario: orders:read
Campos en data
objectOrderobligatorioAn order. Guest data is limited to what is needed to hand it over: the name, the phone for pickup and delivery, the address for delivery, never an e-mail.
Campos anidados (20)
objectstringobligatorioAlways
order.Valores:
"order"idstring (uuid)obligatorioThe order.
codestringobligatorioShort code the guest sees and says at the counter, e.g. K7Q2M9.
external_idstringobligatoriopuede ser nullYour app's reference set with
POST /orders/{id}/acknowledge; null when none. Always null in webhook events and inGET /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.typestringobligatorioHow the guest gets the order.
Valores:
"pickup""delivery""dine_in"sourcestringobligatorioWhere it was placed:
tablevia a table's QR code,appin the Flavoso app by a signed-in guest,storefronteverything else (the restaurant's ordering page, the app without sign-in).Valores:
"storefront""table""app"statusstringobligatorioWhere the order is now. Restaurants may skip statuses, see
GET /store.Valores:
"pending""confirmed""preparing""ready""completed""cancelled"created_atstring (date-time)obligatorioWhen the order was placed. ISO 8601 in UTC (
Z).updated_atstring (date-time)obligatorioLast change. ISO 8601 in UTC (
Z).acknowledged_atstring (date-time)obligatoriopuede ser nullWhen your app first acknowledged the order (
POST /orders/{id}/acknowledge); null when not yet. Always null in webhook events and inGET /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)obligatoriopuede ser nullPickup or delivery time chosen by the guest (pre-order); null means as soon as possible.
currencystringobligatorioISO 4217, e.g. EUR.
amountsobjectobligatorioThe amounts of the order, in cents.
Campos anidados (6)
subtotalintegerobligatorioSum of the items. Integer amount in the smallest currency unit (cents).
delivery_feeintegerobligatorioDelivery fee. Integer amount in the smallest currency unit (cents).
service_feeintegerobligatorioService fee. Integer amount in the smallest currency unit (cents).
discountintegerobligatorioDiscount (stamp card), already subtracted. Integer amount in the smallest currency unit (cents).
tipintegerobligatorioTip. Pass-through, not revenue. Integer amount in the smallest currency unit (cents).
totalintegerobligatoriosubtotal + delivery_fee + service_fee − discount + tip. Integer amount in the smallest currency unit (cents).
taxobjectobligatorioVAT 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.Campos anidados (2)
includedbooleanobligatorioAlways true: prices include VAT.
Valores:
truelinesTaxLine[]obligatorioOne line per rate, ascending, lines without rate last. The gross amounts add up to total − tip.
Campos anidados (4)
rate_bpsintegerobligatoriopuede ser nullThe rate in basis points (700 = 7 %). null: no rate was stored for this part (not the same as 0 %); then net and tax are null.
grossintegerobligatorioGross amount at this rate. Integer amount in the smallest currency unit (cents).
netintegerobligatoriopuede ser nullgross − tax, in cents. null when rate_bps is null.
taxintegerobligatoriopuede ser nullVAT contained in gross: round(gross × rate / (10000 + rate)), in cents. null when rate_bps is null.
paymentobjectobligatorioHow and whether it is paid.
Campos anidados (3)
methodstringobligatorioonline: paid at checkout.on_site: paid at pickup, delivery or the table.Valores:
"online""on_site"statusstringobligatoriopaidonce the online payment is confirmed.open: to be paid on site; it staysopen, because Flavoso does not record payments on site.Valores:
"paid""open"paid_atstring (date-time)obligatoriopuede ser nullWhen it was paid; null while open.
customerobjectobligatoriopuede ser nullOnly what is needed to hand the order over (data minimisation): no e-mail, and no phone for dine-in. null when neither is known.
Campos anidados (2)
namestringobligatoriopuede ser nullThe guest's name.
phonestringobligatoriopuede ser nullPhone for questions; null for dine-in.
deliveryobjectobligatoriopuede ser nullThe delivery address; null unless type is delivery.
Campos anidados (3)
addressstringobligatoriopuede ser nullStreet and number.
postal_codestringobligatoriopuede ser nullPostal code.
citystringobligatoriopuede ser nullCity.
tableobjectobligatoriopuede ser nullThe table of a dine-in order; null otherwise.
Campos anidados (2)
idstring (uuid)obligatorioThe table (
GET /tables).labelstringobligatoriopuede ser nullThe table's name, e.g. 4.
notestringobligatoriopuede ser nullGuest's note for the kitchen (allergies!).
itemsOrderItem[]obligatorioThe lines.
Campos anidados (8)
idstring (uuid)obligatorioThe line.
product_idstring (uuid)obligatoriopuede ser nullThe dish (
GET /menu/products/{id}); null when it was deleted since.namestringobligatorioName at the time of ordering.
quantityintegerobligatorioHow many.
min 1
unit_priceintegerobligatorioPrice of one unit including options. Integer amount in the smallest currency unit (cents).
line_totalintegerobligatoriounit_price × quantity. Integer amount in the smallest currency unit (cents).
tax_rate_bpsintegerobligatoriopuede ser nullVAT rate frozen at order time, in basis points (700 = 7 %). null when the restaurant has not set rates.
optionsobject[]obligatorioThe 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.Campos anidados (5)
idstring (uuid)obligatoriopuede ser nullThe option (
GET /menu/options/{id}); with it you find your own modifier through itsexternal_id. null for orders placed before 8 October 2026.namestringobligatorioName of the option.
price_deltaintegerobligatorioSurcharge of this option, per unit. Integer amount in the smallest currency unit (cents).
group_idstring (uuid)obligatoriopuede ser nullThe option group the option was chosen in (
GET /menu/option-groups/{id}). null for orders placed before 8 October 2026.group_namestringobligatoriopuede ser nullName of that group at order time, e.g. Extras or Size. null for orders placed before 8 October 2026.
{
"id": "evt_2bf5a9b06b75442a9244e884a1acfc57",
"object": "event",
"type": "order.paid",
"created_at": "2026-10-04T17:46:12.410Z",
"api_version": "2026-10-08",
"livemode": true,
"tenant_id": "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa",
"connection_id": "4b3f7c1e-9a2d-4e8b-b5f6-0c1d2e3f4a5b",
"data": {
"object": {
"object": "order",
"id": "37386ae0-ca76-4d50-a738-6ae0ca766d50",
"code": "K7Q2M9",
"external_id": "ART-1001",
"type": "pickup",
"source": "storefront",
"status": "pending",
"created_at": "2026-10-04T17:44:59.942Z",
"updated_at": "2026-10-04T17:44:59.942Z",
"acknowledged_at": "2026-10-04T17:44:59.942Z",
"requested_for": "2026-10-04T17:44:59.942Z",
"currency": "EUR",
"amounts": {
"subtotal": 1290,
"delivery_fee": 1290,
"service_fee": 1290,
"discount": 1290,
"tip": 1290,
"total": 1290
},
"tax": {
"included": true,
"lines": [
{
"rate_bps": 700,
"gross": 1290,
"net": 1290,
"tax": 1290
}
]
},
"payment": {
"method": "online",
"status": "paid",
"paid_at": "2026-10-04T17:44:59.942Z"
},
"customer": {
"name": "string",
"phone": "string"
},
"delivery": {
"address": "string",
"postal_code": "string",
"city": "string"
},
"table": {
"id": "37386ae0-ca76-4d50-a738-6ae0ca766d50",
"label": "string"
},
"note": "string",
"items": [
{
"id": "37386ae0-ca76-4d50-a738-6ae0ca766d50",
"product_id": "6818680c-4376-47b0-a818-680c4376d7b0",
"name": "string",
"quantity": 1,
"unit_price": 1290,
"line_total": 1290,
"tax_rate_bps": 700,
"options": [
{
"id": "37386ae0-ca76-4d50-a738-6ae0ca766d50",
"name": "string",
"price_delta": 1290,
"group_id": "9594642c-e6ef-49ac-a594-642ce6efc9ac",
"group_name": "string"
}
]
}
]
}
}
}Reservas
reservation.created
Hay una reserva nueva, hecha online por el cliente o creada por el equipo.
Permiso necesario: reservations:read
Campos en data
objectReservationobligatorioA table reservation. Contact details stay in Flavoso (data minimisation); the name is enough to greet the party.
Campos anidados (14)
objectstringobligatorioAlways
reservation.Valores:
"reservation"idstring (uuid)obligatorioThe reservation.
codestringobligatorioShort code the guest sees.
statusstringobligatoriopendingis a request the restaurant still has to confirm.Valores:
"pending""confirmed""declined""seated""done""cancelled""no_show"starts_atstring (date-time)obligatorioStart of the reservation. ISO 8601 in UTC (
Z).duration_minutesintegerobligatorioHow long the table is held.
party_sizeintegerobligatorioNumber of guests.
table_idsstring (uuid)[]obligatorioAssigned tables (
GET /tables); empty when none is assigned yet.sourcestringobligatorioBooked online by the guest, by the restaurant's staff, or through this API.
Valores:
"guest""staff""api"guest_namestringobligatoriopuede ser nullThe guest's name.
notestringobligatoriopuede ser nullThe guest's wish.
created_atstring (date-time)obligatorioWhen it was made. ISO 8601 in UTC (
Z).updated_atstring (date-time)obligatorioLast change. ISO 8601 in UTC (
Z).deleted_atstring (date-time)obligatoriopuede ser nullOnly set in the event that reports a deletion; deleted reservations are not returned otherwise.
{
"id": "evt_2bf5a9b06b75442a9244e884a1acfc57",
"object": "event",
"type": "reservation.created",
"created_at": "2026-10-04T17:46:12.410Z",
"api_version": "2026-10-08",
"livemode": true,
"tenant_id": "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa",
"connection_id": "4b3f7c1e-9a2d-4e8b-b5f6-0c1d2e3f4a5b",
"data": {
"object": {
"object": "reservation",
"id": "37386ae0-ca76-4d50-a738-6ae0ca766d50",
"code": "K7Q2M9",
"status": "pending",
"starts_at": "2026-10-04T17:44:59.942Z",
"duration_minutes": 30,
"party_size": 2,
"table_ids": [
"8ca0177d-0bbd-4c8f-aca0-177d0bbd2c8f"
],
"source": "guest",
"guest_name": "string",
"note": "string",
"created_at": "2026-10-04T17:44:59.942Z",
"updated_at": "2026-10-04T17:44:59.942Z",
"deleted_at": "2026-10-04T17:44:59.942Z"
}
}
}reservation.updated
El estado, la hora, el número de personas, la duración, las mesas o la nota de una reserva han cambiado; changed indica qué. Si el negocio borra una reserva, llega un último evento con changed: ["deleted"] y deleted_at; después, la reserva responde con 404.
Permiso necesario: reservations:read
Campos en data
objectReservationobligatorioA table reservation. Contact details stay in Flavoso (data minimisation); the name is enough to greet the party.
Campos anidados (14)
objectstringobligatorioAlways
reservation.Valores:
"reservation"idstring (uuid)obligatorioThe reservation.
codestringobligatorioShort code the guest sees.
statusstringobligatoriopendingis a request the restaurant still has to confirm.Valores:
"pending""confirmed""declined""seated""done""cancelled""no_show"starts_atstring (date-time)obligatorioStart of the reservation. ISO 8601 in UTC (
Z).duration_minutesintegerobligatorioHow long the table is held.
party_sizeintegerobligatorioNumber of guests.
table_idsstring (uuid)[]obligatorioAssigned tables (
GET /tables); empty when none is assigned yet.sourcestringobligatorioBooked online by the guest, by the restaurant's staff, or through this API.
Valores:
"guest""staff""api"guest_namestringobligatoriopuede ser nullThe guest's name.
notestringobligatoriopuede ser nullThe guest's wish.
created_atstring (date-time)obligatorioWhen it was made. ISO 8601 in UTC (
Z).updated_atstring (date-time)obligatorioLast change. ISO 8601 in UTC (
Z).deleted_atstring (date-time)obligatoriopuede ser nullOnly set in the event that reports a deletion; deleted reservations are not returned otherwise.
previous_statusstringpuede ser nullThe status before this change.
changedstring[]obligatorioThe fields this change touched.
Valores:
"status""starts_at""party_size""duration_minutes""table_ids""note""deleted"
{
"id": "evt_2bf5a9b06b75442a9244e884a1acfc57",
"object": "event",
"type": "reservation.updated",
"created_at": "2026-10-04T17:46:12.410Z",
"api_version": "2026-10-08",
"livemode": true,
"tenant_id": "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa",
"connection_id": "4b3f7c1e-9a2d-4e8b-b5f6-0c1d2e3f4a5b",
"data": {
"object": {
"object": "reservation",
"id": "37386ae0-ca76-4d50-a738-6ae0ca766d50",
"code": "K7Q2M9",
"status": "pending",
"starts_at": "2026-10-04T17:44:59.942Z",
"duration_minutes": 30,
"party_size": 2,
"table_ids": [
"8ca0177d-0bbd-4c8f-aca0-177d0bbd2c8f"
],
"source": "guest",
"guest_name": "string",
"note": "string",
"created_at": "2026-10-04T17:44:59.942Z",
"updated_at": "2026-10-04T17:44:59.942Z",
"deleted_at": "2026-10-04T17:44:59.942Z"
},
"previous_status": "string",
"changed": [
"status"
]
}
}Negocio
store.paused
Los pedidos online se han pausado hasta paused_until; object es el negocio, como en store.updated. Si la pausa termina sola, no llega ningún evento propio.
Permiso necesario: store:read
Campos en data
objectStoreobligatorioThe store when the event was first read.
paused_untilandnotenext to it are the values of this pause.Campos anidados (22)
objectstringobligatorioAlways
store.Valores:
"store"idstring (uuid)obligatorioThe restaurant.
namestringobligatorioName.
slugstringobligatorioIts address:
<slug>.flavoso.com.timezonestringobligatorioIANA time zone of all local times.
currencystringobligatorioISO 4217.
statusstringobligatorioRight now: open, closed (outside hours or a closed special day), or paused.
Valores:
"open""closed""paused"paused_untilstring (date-time)obligatoriopuede ser nullEnd of the running pause; null without one.
pause_notestringobligatoriopuede ser nullReason of the running pause.
next_opening_atstring (date-time)obligatoriopuede ser nullNext opening while closed (looks two weeks ahead); null while open.
preordersbooleanobligatorioGuests may order for a later time, also while closed.
order_typesobjectobligatorioWhich order types guests can choose.
Campos anidados (3)
pickupbooleanobligatorioPickup.
deliverybooleanobligatorioDelivery.
dine_inbooleanobligatorioOrdering at the table via QR code (Pro and up).
order_statusesstring[]obligatorioStatuses this restaurant uses, in order, plus completed and cancelled.
lead_timesobjectobligatorioHow long the kitchen needs; the earliest pickup or delivery time.
Campos anidados (2)
pickup_minutesintegerobligatorioMinutes until pickup, 0 to 240.
delivery_minutesintegerobligatorioMinutes until delivery, 0 to 360.
min_orderintegerobligatorioMinimum order value for delivery (0 = none). Integer amount in the smallest currency unit (cents).
always_openbooleanobligatorioNo weekly schedule is set: online orders are taken around the clock (special days and pauses still apply) and no reservation times are offered.
opening_hoursWeekWindow[]obligatorioThe weekly opening windows; a weekday without windows is closed.
Campos anidados (3)
weekdayintegerobligatorio0 = Monday … 6 = Sunday.
0 to 6
openstringobligatorioOpening. 24-hour local time "HH:MM" in the restaurant's time zone.
pattern ^([01][0-9]|2[0-3]):[0-5][0-9]$
closestringobligatorioClosing. Earlier than open: the window runs past midnight. Equal to open: until midnight. 24-hour local time "HH:MM" in the restaurant's time zone.
pattern ^([01][0-9]|2[0-3]):[0-5][0-9]$
delivery_hoursWeekWindow[]obligatorioWeekly delivery windows; empty means delivery follows opening_hours.
Campos anidados (3)
weekdayintegerobligatorio0 = Monday … 6 = Sunday.
0 to 6
openstringobligatorioOpening. 24-hour local time "HH:MM" in the restaurant's time zone.
pattern ^([01][0-9]|2[0-3]):[0-5][0-9]$
closestringobligatorioClosing. Earlier than open: the window runs past midnight. Equal to open: until midnight. 24-hour local time "HH:MM" in the restaurant's time zone.
pattern ^([01][0-9]|2[0-3]):[0-5][0-9]$
closuresClosure[]obligatorioUpcoming special days (today and later).
Campos anidados (5)
objectstringobligatorioAlways
closure.Valores:
"closure"datestring (date)obligatorioThe day. A date YYYY-MM-DD in the restaurant's time zone.
closedbooleanobligatorioClosed all day.
hoursTimeWindow[]obligatorioThe windows of that day when not closed (at most two).
Campos anidados (2)
openstringobligatorioOpening. 24-hour local time "HH:MM" in the restaurant's time zone.
pattern ^([01][0-9]|2[0-3]):[0-5][0-9]$
closestringobligatorioClosing; earlier than open runs past midnight. 24-hour local time "HH:MM" in the restaurant's time zone.
pattern ^([01][0-9]|2[0-3]):[0-5][0-9]$
notestringobligatoriopuede ser nullNote, e.g. the reason.
contactobjectobligatorioPublic contact details.
Campos anidados (3)
phonestringobligatoriopuede ser nullPhone.
emailstringobligatoriopuede ser nullE-mail.
websitestringobligatoriopuede ser nullWebsite.
addressobjectobligatoriopuede ser nullThe address as far as it is known. Restaurants type it freely; postal code and city are only split out when a line starts with a postal code.
Campos anidados (4)
linestringobligatoriopuede ser nullStreet and number (or the whole address when it cannot be split).
postal_codestringobligatoriopuede ser nullPostal code, when it can be read from the address.
citystringobligatoriopuede ser nullCity, when it can be read from the address.
countrystringobligatoriopuede ser nullISO 3166-1 alpha-2, as in GET /me.
locationobjectobligatoriopuede ser nullCoordinates; null when not set.
Campos anidados (2)
latnumberobligatorioLatitude.
lonnumberobligatorioLongitude.
paused_untilstring (date-time)obligatorioWhen ordering resumes by itself.
notestringobligatoriopuede ser nullThe reason, if given.
{
"id": "evt_2bf5a9b06b75442a9244e884a1acfc57",
"object": "event",
"type": "store.paused",
"created_at": "2026-10-04T17:46:12.410Z",
"api_version": "2026-10-08",
"livemode": true,
"tenant_id": "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa",
"connection_id": "4b3f7c1e-9a2d-4e8b-b5f6-0c1d2e3f4a5b",
"data": {
"object": {
"object": "store",
"id": "37386ae0-ca76-4d50-a738-6ae0ca766d50",
"name": "string",
"slug": "pizzeria-example",
"timezone": "Europe/Berlin",
"currency": "EUR",
"status": "open",
"paused_until": "2026-10-04T17:44:59.942Z",
"pause_note": "string",
"next_opening_at": "2026-10-04T17:44:59.942Z",
"preorders": true,
"order_types": {
"pickup": true,
"delivery": true,
"dine_in": true
},
"order_statuses": [
"string"
],
"lead_times": {
"pickup_minutes": 30,
"delivery_minutes": 30
},
"min_order": 1290,
"always_open": true,
"opening_hours": [
{
"weekday": 0,
"open": "11:30",
"close": "22:00"
}
],
"delivery_hours": [
{
"weekday": 0,
"open": "11:30",
"close": "22:00"
}
],
"closures": [
{
"object": "closure",
"date": "2026-10-04",
"closed": true,
"hours": [
{
"open": "11:30",
"close": "22:00"
}
],
"note": "string"
}
],
"contact": {
"phone": "string",
"email": "string",
"website": "string"
},
"address": {
"line": "string",
"postal_code": "string",
"city": "string",
"country": "DE"
},
"location": {
"lat": 0,
"lon": 0
}
},
"paused_until": "2026-10-04T17:44:59.942Z",
"note": "string"
}
}store.resumed
Una pausa en curso se ha terminado antes de tiempo; object es el negocio.
Permiso necesario: store:read
Campos en data
objectStoreobligatorioThe store when the event was first read.
Campos anidados (22)
objectstringobligatorioAlways
store.Valores:
"store"idstring (uuid)obligatorioThe restaurant.
namestringobligatorioName.
slugstringobligatorioIts address:
<slug>.flavoso.com.timezonestringobligatorioIANA time zone of all local times.
currencystringobligatorioISO 4217.
statusstringobligatorioRight now: open, closed (outside hours or a closed special day), or paused.
Valores:
"open""closed""paused"paused_untilstring (date-time)obligatoriopuede ser nullEnd of the running pause; null without one.
pause_notestringobligatoriopuede ser nullReason of the running pause.
next_opening_atstring (date-time)obligatoriopuede ser nullNext opening while closed (looks two weeks ahead); null while open.
preordersbooleanobligatorioGuests may order for a later time, also while closed.
order_typesobjectobligatorioWhich order types guests can choose.
Campos anidados (3)
pickupbooleanobligatorioPickup.
deliverybooleanobligatorioDelivery.
dine_inbooleanobligatorioOrdering at the table via QR code (Pro and up).
order_statusesstring[]obligatorioStatuses this restaurant uses, in order, plus completed and cancelled.
lead_timesobjectobligatorioHow long the kitchen needs; the earliest pickup or delivery time.
Campos anidados (2)
pickup_minutesintegerobligatorioMinutes until pickup, 0 to 240.
delivery_minutesintegerobligatorioMinutes until delivery, 0 to 360.
min_orderintegerobligatorioMinimum order value for delivery (0 = none). Integer amount in the smallest currency unit (cents).
always_openbooleanobligatorioNo weekly schedule is set: online orders are taken around the clock (special days and pauses still apply) and no reservation times are offered.
opening_hoursWeekWindow[]obligatorioThe weekly opening windows; a weekday without windows is closed.
Campos anidados (3)
weekdayintegerobligatorio0 = Monday … 6 = Sunday.
0 to 6
openstringobligatorioOpening. 24-hour local time "HH:MM" in the restaurant's time zone.
pattern ^([01][0-9]|2[0-3]):[0-5][0-9]$
closestringobligatorioClosing. Earlier than open: the window runs past midnight. Equal to open: until midnight. 24-hour local time "HH:MM" in the restaurant's time zone.
pattern ^([01][0-9]|2[0-3]):[0-5][0-9]$
delivery_hoursWeekWindow[]obligatorioWeekly delivery windows; empty means delivery follows opening_hours.
Campos anidados (3)
weekdayintegerobligatorio0 = Monday … 6 = Sunday.
0 to 6
openstringobligatorioOpening. 24-hour local time "HH:MM" in the restaurant's time zone.
pattern ^([01][0-9]|2[0-3]):[0-5][0-9]$
closestringobligatorioClosing. Earlier than open: the window runs past midnight. Equal to open: until midnight. 24-hour local time "HH:MM" in the restaurant's time zone.
pattern ^([01][0-9]|2[0-3]):[0-5][0-9]$
closuresClosure[]obligatorioUpcoming special days (today and later).
Campos anidados (5)
objectstringobligatorioAlways
closure.Valores:
"closure"datestring (date)obligatorioThe day. A date YYYY-MM-DD in the restaurant's time zone.
closedbooleanobligatorioClosed all day.
hoursTimeWindow[]obligatorioThe windows of that day when not closed (at most two).
Campos anidados (2)
openstringobligatorioOpening. 24-hour local time "HH:MM" in the restaurant's time zone.
pattern ^([01][0-9]|2[0-3]):[0-5][0-9]$
closestringobligatorioClosing; earlier than open runs past midnight. 24-hour local time "HH:MM" in the restaurant's time zone.
pattern ^([01][0-9]|2[0-3]):[0-5][0-9]$
notestringobligatoriopuede ser nullNote, e.g. the reason.
contactobjectobligatorioPublic contact details.
Campos anidados (3)
phonestringobligatoriopuede ser nullPhone.
emailstringobligatoriopuede ser nullE-mail.
websitestringobligatoriopuede ser nullWebsite.
addressobjectobligatoriopuede ser nullThe address as far as it is known. Restaurants type it freely; postal code and city are only split out when a line starts with a postal code.
Campos anidados (4)
linestringobligatoriopuede ser nullStreet and number (or the whole address when it cannot be split).
postal_codestringobligatoriopuede ser nullPostal code, when it can be read from the address.
citystringobligatoriopuede ser nullCity, when it can be read from the address.
countrystringobligatoriopuede ser nullISO 3166-1 alpha-2, as in GET /me.
locationobjectobligatoriopuede ser nullCoordinates; null when not set.
Campos anidados (2)
latnumberobligatorioLatitude.
lonnumberobligatorioLongitude.
{
"id": "evt_2bf5a9b06b75442a9244e884a1acfc57",
"object": "event",
"type": "store.resumed",
"created_at": "2026-10-04T17:46:12.410Z",
"api_version": "2026-10-08",
"livemode": true,
"tenant_id": "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa",
"connection_id": "4b3f7c1e-9a2d-4e8b-b5f6-0c1d2e3f4a5b",
"data": {
"object": {
"object": "store",
"id": "37386ae0-ca76-4d50-a738-6ae0ca766d50",
"name": "string",
"slug": "pizzeria-example",
"timezone": "Europe/Berlin",
"currency": "EUR",
"status": "open",
"paused_until": "2026-10-04T17:44:59.942Z",
"pause_note": "string",
"next_opening_at": "2026-10-04T17:44:59.942Z",
"preorders": true,
"order_types": {
"pickup": true,
"delivery": true,
"dine_in": true
},
"order_statuses": [
"string"
],
"lead_times": {
"pickup_minutes": 30,
"delivery_minutes": 30
},
"min_order": 1290,
"always_open": true,
"opening_hours": [
{
"weekday": 0,
"open": "11:30",
"close": "22:00"
}
],
"delivery_hours": [
{
"weekday": 0,
"open": "11:30",
"close": "22:00"
}
],
"closures": [
{
"object": "closure",
"date": "2026-10-04",
"closed": true,
"hours": [
{
"open": "11:30",
"close": "22:00"
}
],
"note": "string"
}
],
"contact": {
"phone": "string",
"email": "string",
"website": "string"
},
"address": {
"line": "string",
"postal_code": "string",
"city": "string",
"country": "DE"
},
"location": {
"lat": 0,
"lon": 0
}
}
}
}store.updated
Los horarios de apertura, los días especiales, los tiempos de preparación, los tipos de pedido, el pedido mínimo o los estados que usa el negocio (order_statuses) han cambiado; changed indica qué.
Permiso necesario: store:read
Campos en data
objectStoreobligatorioThe restaurant as a store: status, schedule, ordering rules and contact.
Campos anidados (22)
objectstringobligatorioAlways
store.Valores:
"store"idstring (uuid)obligatorioThe restaurant.
namestringobligatorioName.
slugstringobligatorioIts address:
<slug>.flavoso.com.timezonestringobligatorioIANA time zone of all local times.
currencystringobligatorioISO 4217.
statusstringobligatorioRight now: open, closed (outside hours or a closed special day), or paused.
Valores:
"open""closed""paused"paused_untilstring (date-time)obligatoriopuede ser nullEnd of the running pause; null without one.
pause_notestringobligatoriopuede ser nullReason of the running pause.
next_opening_atstring (date-time)obligatoriopuede ser nullNext opening while closed (looks two weeks ahead); null while open.
preordersbooleanobligatorioGuests may order for a later time, also while closed.
order_typesobjectobligatorioWhich order types guests can choose.
Campos anidados (3)
pickupbooleanobligatorioPickup.
deliverybooleanobligatorioDelivery.
dine_inbooleanobligatorioOrdering at the table via QR code (Pro and up).
order_statusesstring[]obligatorioStatuses this restaurant uses, in order, plus completed and cancelled.
lead_timesobjectobligatorioHow long the kitchen needs; the earliest pickup or delivery time.
Campos anidados (2)
pickup_minutesintegerobligatorioMinutes until pickup, 0 to 240.
delivery_minutesintegerobligatorioMinutes until delivery, 0 to 360.
min_orderintegerobligatorioMinimum order value for delivery (0 = none). Integer amount in the smallest currency unit (cents).
always_openbooleanobligatorioNo weekly schedule is set: online orders are taken around the clock (special days and pauses still apply) and no reservation times are offered.
opening_hoursWeekWindow[]obligatorioThe weekly opening windows; a weekday without windows is closed.
Campos anidados (3)
weekdayintegerobligatorio0 = Monday … 6 = Sunday.
0 to 6
openstringobligatorioOpening. 24-hour local time "HH:MM" in the restaurant's time zone.
pattern ^([01][0-9]|2[0-3]):[0-5][0-9]$
closestringobligatorioClosing. Earlier than open: the window runs past midnight. Equal to open: until midnight. 24-hour local time "HH:MM" in the restaurant's time zone.
pattern ^([01][0-9]|2[0-3]):[0-5][0-9]$
delivery_hoursWeekWindow[]obligatorioWeekly delivery windows; empty means delivery follows opening_hours.
Campos anidados (3)
weekdayintegerobligatorio0 = Monday … 6 = Sunday.
0 to 6
openstringobligatorioOpening. 24-hour local time "HH:MM" in the restaurant's time zone.
pattern ^([01][0-9]|2[0-3]):[0-5][0-9]$
closestringobligatorioClosing. Earlier than open: the window runs past midnight. Equal to open: until midnight. 24-hour local time "HH:MM" in the restaurant's time zone.
pattern ^([01][0-9]|2[0-3]):[0-5][0-9]$
closuresClosure[]obligatorioUpcoming special days (today and later).
Campos anidados (5)
objectstringobligatorioAlways
closure.Valores:
"closure"datestring (date)obligatorioThe day. A date YYYY-MM-DD in the restaurant's time zone.
closedbooleanobligatorioClosed all day.
hoursTimeWindow[]obligatorioThe windows of that day when not closed (at most two).
Campos anidados (2)
openstringobligatorioOpening. 24-hour local time "HH:MM" in the restaurant's time zone.
pattern ^([01][0-9]|2[0-3]):[0-5][0-9]$
closestringobligatorioClosing; earlier than open runs past midnight. 24-hour local time "HH:MM" in the restaurant's time zone.
pattern ^([01][0-9]|2[0-3]):[0-5][0-9]$
notestringobligatoriopuede ser nullNote, e.g. the reason.
contactobjectobligatorioPublic contact details.
Campos anidados (3)
phonestringobligatoriopuede ser nullPhone.
emailstringobligatoriopuede ser nullE-mail.
websitestringobligatoriopuede ser nullWebsite.
addressobjectobligatoriopuede ser nullThe address as far as it is known. Restaurants type it freely; postal code and city are only split out when a line starts with a postal code.
Campos anidados (4)
linestringobligatoriopuede ser nullStreet and number (or the whole address when it cannot be split).
postal_codestringobligatoriopuede ser nullPostal code, when it can be read from the address.
citystringobligatoriopuede ser nullCity, when it can be read from the address.
countrystringobligatoriopuede ser nullISO 3166-1 alpha-2, as in GET /me.
locationobjectobligatoriopuede ser nullCoordinates; null when not set.
Campos anidados (2)
latnumberobligatorioLatitude.
lonnumberobligatorioLongitude.
changedstring[]obligatorioThe Store fields this change touched.
Valores:
"opening_hours""delivery_hours""closures""lead_times""preorders""order_types""min_order""order_statuses"
{
"id": "evt_2bf5a9b06b75442a9244e884a1acfc57",
"object": "event",
"type": "store.updated",
"created_at": "2026-10-04T17:46:12.410Z",
"api_version": "2026-10-08",
"livemode": true,
"tenant_id": "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa",
"connection_id": "4b3f7c1e-9a2d-4e8b-b5f6-0c1d2e3f4a5b",
"data": {
"object": {
"object": "store",
"id": "37386ae0-ca76-4d50-a738-6ae0ca766d50",
"name": "string",
"slug": "pizzeria-example",
"timezone": "Europe/Berlin",
"currency": "EUR",
"status": "open",
"paused_until": "2026-10-04T17:44:59.942Z",
"pause_note": "string",
"next_opening_at": "2026-10-04T17:44:59.942Z",
"preorders": true,
"order_types": {
"pickup": true,
"delivery": true,
"dine_in": true
},
"order_statuses": [
"string"
],
"lead_times": {
"pickup_minutes": 30,
"delivery_minutes": 30
},
"min_order": 1290,
"always_open": true,
"opening_hours": [
{
"weekday": 0,
"open": "11:30",
"close": "22:00"
}
],
"delivery_hours": [
{
"weekday": 0,
"open": "11:30",
"close": "22:00"
}
],
"closures": [
{
"object": "closure",
"date": "2026-10-04",
"closed": true,
"hours": [
{
"open": "11:30",
"close": "22:00"
}
],
"note": "string"
}
],
"contact": {
"phone": "string",
"email": "string",
"website": "string"
},
"address": {
"line": "string",
"postal_code": "string",
"city": "string",
"country": "DE"
},
"location": {
"lat": 0,
"lon": 0
}
},
"changed": [
"opening_hours"
]
}
}Conexión
app.connected
Un negocio ha conectado tu app, o la ha vuelto a conectar después de que terminara la conexión.
Permiso necesario: ninguno, solo la propia conexión
Campos en data
objectConnectionSummaryobligatorioThe connection in
app.*events.Campos anidados (5)
objectstringobligatorioAlways
connection.Valores:
"connection"idstring (uuid)obligatorioThe connection.
scopesstring[]obligatorioThe permissions the restaurant granted.
Valores:
"orders:read""orders:write""menu:read""menu:write""store:read""store:write""reservations:read""reservations:write""reports:read"created_atstring (date-time)obligatorioWhen the restaurant connected the app. ISO 8601 in UTC (
Z).revoked_atstring (date-time)obligatoriopuede ser nullWhen the connection ended; null while it is active.
{
"id": "evt_2bf5a9b06b75442a9244e884a1acfc57",
"object": "event",
"type": "app.connected",
"created_at": "2026-10-04T17:46:12.410Z",
"api_version": "2026-10-08",
"livemode": true,
"tenant_id": "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa",
"connection_id": "4b3f7c1e-9a2d-4e8b-b5f6-0c1d2e3f4a5b",
"data": {
"object": {
"object": "connection",
"id": "37386ae0-ca76-4d50-a738-6ae0ca766d50",
"scopes": [
"orders:read"
],
"created_at": "2026-10-04T17:44:59.942Z",
"revoked_at": "2026-10-04T17:44:59.942Z"
}
}
}app.scopes_changed
Los permisos de una conexión existente han cambiado porque el propietario ha vuelto a conectar tu app con otros permisos. previous_scopes indica los anteriores.
Permiso necesario: ninguno, solo la propia conexión
Campos en data
objectConnectionSummaryobligatorioThe connection in
app.*events.Campos anidados (5)
objectstringobligatorioAlways
connection.Valores:
"connection"idstring (uuid)obligatorioThe connection.
scopesstring[]obligatorioThe permissions the restaurant granted.
Valores:
"orders:read""orders:write""menu:read""menu:write""store:read""store:write""reservations:read""reservations:write""reports:read"created_atstring (date-time)obligatorioWhen the restaurant connected the app. ISO 8601 in UTC (
Z).revoked_atstring (date-time)obligatoriopuede ser nullWhen the connection ended; null while it is active.
previous_scopesstring[]obligatorioThe permissions before this change.
{
"id": "evt_2bf5a9b06b75442a9244e884a1acfc57",
"object": "event",
"type": "app.scopes_changed",
"created_at": "2026-10-04T17:46:12.410Z",
"api_version": "2026-10-08",
"livemode": true,
"tenant_id": "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa",
"connection_id": "4b3f7c1e-9a2d-4e8b-b5f6-0c1d2e3f4a5b",
"data": {
"object": {
"object": "connection",
"id": "37386ae0-ca76-4d50-a738-6ae0ca766d50",
"scopes": [
"orders:read"
],
"created_at": "2026-10-04T17:44:59.942Z",
"revoked_at": "2026-10-04T17:44:59.942Z"
},
"previous_scopes": [
"string"
]
}
}app.disconnected
La conexión con un negocio ha terminado: la desconectó el propietario, tu app (DELETE /connection) o Flavoso. reason indica quién. A partir de ese momento, ningún token de esa conexión es válido; por eso nunca llega a través de GET /events.
Permiso necesario: ninguno, solo la propia conexión
Campos en data
objectConnectionSummaryobligatorioThe connection in
app.*events.Campos anidados (5)
objectstringobligatorioAlways
connection.Valores:
"connection"idstring (uuid)obligatorioThe connection.
scopesstring[]obligatorioThe permissions the restaurant granted.
Valores:
"orders:read""orders:write""menu:read""menu:write""store:read""store:write""reservations:read""reservations:write""reports:read"created_atstring (date-time)obligatorioWhen the restaurant connected the app. ISO 8601 in UTC (
Z).revoked_atstring (date-time)obligatoriopuede ser nullWhen the connection ended; null while it is active.
reasonstringobligatorioWho ended the connection.
Valores:
"owner""app""admin"
{
"id": "evt_2bf5a9b06b75442a9244e884a1acfc57",
"object": "event",
"type": "app.disconnected",
"created_at": "2026-10-04T17:46:12.410Z",
"api_version": "2026-10-08",
"livemode": true,
"tenant_id": "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa",
"connection_id": "4b3f7c1e-9a2d-4e8b-b5f6-0c1d2e3f4a5b",
"data": {
"object": {
"object": "connection",
"id": "37386ae0-ca76-4d50-a738-6ae0ca766d50",
"scopes": [
"orders:read"
],
"created_at": "2026-10-04T17:44:59.942Z",
"revoked_at": "2026-10-04T17:44:59.942Z"
},
"reason": "owner"
}
}Prueba
ping
Solo con «Enviar un evento de prueba» en la consola. Nunca se produce por sí solo.
Permiso necesario: ninguno, solo la propia conexión
Campos en data
messagestring
{
"id": "evt_2bf5a9b06b75442a9244e884a1acfc57",
"object": "event",
"type": "ping",
"created_at": "2026-10-04T17:46:12.410Z",
"api_version": "2026-10-08",
"livemode": true,
"tenant_id": "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa",
"connection_id": "4b3f7c1e-9a2d-4e8b-b5f6-0c1d2e3f4a5b",
"data": {
"message": "string"
}
}¿Algo no ha quedado claro? Escribe a support@flavoso.com e indica el identificador de X-Request-Id. Así podremos encontrar tu solicitud en el registro.