Detalle de un producto
POST /api/catalog/get-product
Descripción
Devuelve el detalle de un producto con sus variaciones y sus opciones para personalizarlo.
Detalles
Retorna los datos del producto elegido dentro del menú: precio, descripción, fotos, alérgenos, las variaciones con las que se ofrece y los grupos de opciones para personalizarlo con sus precios. Falla si el producto no está disponible en ese menú.
Permisos requeridos
public
Request
| Nombre | Tipo | Requerido | Reglas |
|---|---|---|---|
| slug | string | Sí |
min:1
max:63
|
| token | string | No |
min:1
max:64
|
| reservationUuid | string | No |
min:36
max:36
|
| menuId | int | Sí |
min_value:1
|
| productUuid | string | Sí |
min:36
max:36
|
Respuesta
Campos que devuelve dentro de data. Nada fuera de esta lista sale en la respuesta.
| Campo | Tipo | Descripción |
|---|---|---|
| product | object | Detalle del producto |
| product.productId | int | Identificador del producto, para agregarlo al pedido |
| product.productUuid | string | Identificador público del producto |
| product.name | string | Nombre del producto |
| product.description | string Admite vacío | Descripción del producto |
| product.priceCents | int | Precio base, en centavos |
| product.icon | string Admite vacío | Ícono del producto |
| product.color | string Admite vacío | Color del producto |
| product.categoryId | int | Identificador de la categoría |
| product.categoryName | string | Nombre de la categoría |
| product.categoryColor | string Admite vacío | Color de la categoría |
| product.imageUrl | string Admite vacío | Foto principal |
| product.images | array | Fotos del producto |
| product.images[].url | string | Dirección de la foto |
| product.allergens | array | Alérgenos del producto |
| product.allergens[].allergenId | int | Identificador del alérgeno |
| product.allergens[].name | string | Nombre del alérgeno |
| product.allergens[].icon | string Admite vacío | Ícono del alérgeno |
| product.allergens[].contains | string | Si lo contiene o puede tener trazas |
| product.modifierGroups | array | Grupos de opciones para personalizar el producto |
| product.modifierGroups[].modifierGroupId | int | Identificador del grupo, para agregarlo al pedido |
| product.modifierGroups[].name | string | Nombre del grupo |
| product.modifierGroups[].description | string Admite vacío | Descripción del grupo |
| product.modifierGroups[].minSelections | int | Mínimo de opciones a elegir |
| product.modifierGroups[].maxSelections | int Admite vacío | Máximo de opciones; vacío si no tiene tope |
| product.modifierGroups[].isCollapsible | bool | Si el grupo se muestra plegado |
| product.modifierGroups[].options | array | Opciones del grupo |
| product.modifierGroups[].options[].modifierId | int | Identificador de la opción, para agregarla al pedido |
| product.modifierGroups[].options[].name | string | Nombre de la opción |
| product.modifierGroups[].options[].priceCents | int | Precio adicional, en centavos |
| product.modifierGroups[].options[].minQuantity | int | Cantidad mínima |
| product.modifierGroups[].options[].maxQuantity | int Admite vacío | Cantidad máxima; vacío si no tiene tope |
| product.modifierGroups[].options[].defaultQuantity | int | Cantidad sugerida |
| product.likesCount | int | Cantidad de me gusta |
| product.likedByMe | bool | Si le diste me gusta |
| product.viewsCount | int | Cantidad de vistas |
| product.questionsCount | int | Cantidad de preguntas |
| prices | array | Precios entre los que se elige al pedir |
| prices[].productPriceId | int Admite vacío | Identificador del precio; vacío si es el precio base |
| prices[].priceName | string Admite vacío | Nombre del precio |
| prices[].priceType | string | Tipo de precio |
| prices[].resolvedPriceCents | int | Precio a cobrar, en centavos |
| priceOptions | array | Variaciones de cada precio |
| priceOptions[].productPriceId | int | Precio al que pertenece |
| priceOptions[].optionId | int | Identificador de la variación, para agregarla al pedido |
| priceOptions[].description | string | Nombre de la variación |
| priceOptions[].priceCents | int | Precio de la variación, en centavos |
Ejemplo de request
curl -X POST https://restofy.pro/api/catalog/get-product \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <accessToken>" \
-d '{
"slug": "string",
"menuId": 1,
"productUuid": "string"
}'
Los valores son demo: reemplázalos por datos reales del negocio.
Ejemplo de respuesta
Actualizado: 2026-10-09T02:12:12Z
HTTP 200
Request
{
"slug": "restofy_test_catalogpublictes_2238_1791511154_tenant",
"menuId": 6,
"productUuid": "3662a28e-18be-11f1-9da2-b627060a1ebe"
}
Response
{
"success": true,
"message": "Operación realizada correctamente",
"data": {
"product": {
"productId": 16,
"productUuid": "3662a28e-18be-11f1-9da2-b627060a1ebe",
"name": "Limonada Natural",
"description": "Limonada natural con hielo y menta",
"priceCents": 500000,
"icon": "fa-solid fa-glass-citrus",
"color": "#84cc16",
"categoryId": 9,
"categoryName": "Bebidas Frías",
"categoryColor": "#06b6d4",
"imageUrl": null,
"images": [],
"allergens": [
{
"allergenId": 12,
"name": "Sulfitos",
"icon": "fa-solid fa-wine-bottle",
"contains": "free"
}
],
"modifierGroups": [],
"likesCount": 0,
"likedByMe": false,
"viewsCount": 0,
"questionsCount": 0
},
"prices": [
{
"productPriceId": null,
"priceName": null,
"priceType": "inherit",
"resolvedPriceCents": 500000
}
],
"priceOptions": []
}
}