La definición de un producto o servicio a nivel de la Company (o de un comercio,
branch_group_id). El Good describe qué es el producto (nombre, imágenes, tipo,
unidad de venta, límites); su disponibilidad, precio de venta y stock por sucursal viven en
BranchGood.
type)type es un bitmask; los flags booleanos derivados se definen en onInitializeBitMaskBags().
type_class (clase base): is_type_service (servicio, no un producto físico),
is_type_custom_pickup (el repartidor debe buscar el ítem en otro lugar, p. ej. un traje en
la lavandería) o is_type_digital (producto digital, sin entrega física).is_type_list — producto "de lista": sin imagen; en categorías del mismo tipo se muestra en
un listado compacto (solo nombre y precio). Solo afecta la interfaz.is_combo — agrupa otros productos (ver materials).digital_class (si es digital): is_digital_custom (entrega digital personalizada, p. ej.
una gift card con código) o is_digital_balance (recarga del saldo del cliente).is_fragile_handling_required, is_cold_storage_required,
is_liquid_handling_required, is_large_backpack_required.Al importar catálogos se usa una jerarquía de tres niveles: group_code / group_name (grupo,
nivel superior) → subgroup_code / subgroup_name (subgrupo) → category_code /
category_name (categoría). Además: sku (referencia de inventario del comercio), plu
(código para balanzas), internal_code (código interno propio), barcodes (códigos de barras)
y keywords (palabras para la búsqueda).
materials)is_combo es true: materials son los productos que componen el combo.is_combo es false: materials son insumos que consume el producto al venderse (p. ej.
una hamburguesa consume pan y carne), y el sistema calcula el stock a partir de ellos.
materials_stock es el stock derivado de esos insumos; material_owners indica de qué
productos este Good es material.max_quantity limita cuánto puede comprar un cliente según limit_type: per_order,
per_day, per_week, per_month o per_hours:<n>. limit_description es el texto legible.
| Atributo | Tipo | Descripción |
|---|---|---|
id |
int |
|
name |
string |
Nombre del producto |
short_details |
string |
Descripción corta |
details |
string |
Descripción larga |
picture_urls |
array |
Imágenes del producto (formato horizontal) |
price_e2 |
int |
Precio base de referencia (× 100); el precio de venta real está en {@link BranchGood} |
type |
int |
Bitmask de tipo (ver "Tipo de producto") |
rating_e2 |
int |
Rating del producto (× 100) |
rating_sum |
int |
Suma de calificaciones recibidas |
rating_count |
int |
Cantidad de calificaciones recibidas |
eta |
string\|null |
Tiempo estimado de preparación (texto) |
created_at |
datetime\|null |
|
updated_at |
datetime\|null |
|
deleted_at |
datetime\|null |
|
company_id |
int |
Company dueña del producto (oculto) |
provider_fee_e2 |
int |
Comisión del proveedor por vender este producto, monto fijo (× 100) |
provider_fee_prc |
float |
Comisión del proveedor, porcentaje (fracción 0–1) |
sku |
string\|null |
Código SKU (referencia de inventario del comercio) |
good_type_id |
int\|null |
{@link GoodType} — clasificación transversal del producto |
notes_enabled |
bool |
Pedir instrucciones especiales (opcionales) al ordenar |
branch_group_id |
int\|null |
Comercio (marca) al que pertenece el producto, si aplica |
unit |
string |
Unidad de venta (ej. und, Kg) |
max_quantity |
int\|null |
Límite de compra por cliente (según limit_type) |
limit_type |
string\|null |
Ventana del límite: per_order | per_day | per_week | per_month | per_hours:<n> |
unit_config |
SellingUnit\|null |
Configuración de venta por peso/fracción (detalle en {@link BranchGood}) |
vertical_picture_urls |
array |
Imágenes del producto (formato vertical) |
keywords |
array |
Palabras clave para la búsqueda |
eta_config_id |
int\|null |
{@link EtaConfig} de disponibilidad horaria / ETA del producto |
weight |
string\|null |
Peso del producto (texto) |
computed |
array |
Caché interno de valores derivados (oculto) |
barcodes |
array |
Códigos de barras del producto |
category_code |
string\|null |
Código de la categoría en la jerarquía de catálogo |
category_name |
string\|null |
Nombre de la categoría en la jerarquía de catálogo |
enforce_per_unit |
bool |
Forzar la venta por unidad (no por fracción/peso) |
group_code |
string\|null |
Código del grupo (nivel superior de la jerarquía de catálogo) |
group_name |
string\|null |
Nombre del grupo (nivel superior de la jerarquía de catálogo) |
internal_code |
string\|null |
Código interno del comercio (referencia propia) |
label |
string\|null |
Etiqueta destacada del producto (ej. "Nuevo", "Oferta") |
label_key |
string\|null |
Clave de internacionalización de label |
material_owners |
array\|null |
Productos de los que este Good es material |
materials_stock |
array\|null |
Stock derivado de los insumos (materials) |
plu |
string\|null |
Código PLU (para balanzas) |
subgroup_code |
string\|null |
Código del subgrupo (nivel intermedio de la jerarquía de catálogo) |
subgroup_name |
string\|null |
Nombre del subgrupo (nivel intermedio de la jerarquía de catálogo) |
is_type_service |
bool |
BitMask (({@link self::type} & 0x1) !== 0) |
is_type_custom_pickup |
bool |
BitMask (({@link self::type} & 0x2) !== 0) |
is_type_digital |
bool |
BitMask (({@link self::type} & 0x4) !== 0) |
is_type_list |
bool |
BitMask (({@link self::type} & 0x10) !== 0) |
is_combo |
bool |
BitMask (({@link self::type} & 0x20) !== 0) |
is_digital_custom |
bool |
BitMask (({@link self::type} & 0x100) !== 0) |
is_digital_balance |
bool |
BitMask (({@link self::type} & 0x200) !== 0) |
is_fragile_handling_required |
bool |
BitMask (({@link self::type} & 0x10000) !== 0) |
is_cold_storage_required |
bool |
BitMask (({@link self::type} & 0x20000) !== 0) |
is_liquid_handling_required |
bool |
BitMask (({@link self::type} & 0x40000) !== 0) |
is_large_backpack_required |
bool |
BitMask (({@link self::type} & 0x80000) !== 0) |
type_class |
int |
BitMask ({@link self::type} & 0x7) |
digital_class |
int |
BitMask (({@link self::type} & 0xff00) >> 8) |
allLogs |
ApiLog> |
|
allowedProviders |
ProviderSkill> |
Proveedores habilitados para atender este producto/servicio |
attachedBranches |
Branch> |
Sucursales que ofrecen este producto |
attachedRequirements |
GoodRequirement> |
|
branchGoods |
BranchGood> |
Ofertas del producto en cada sucursal |
branchGroup |
BranchGroup\|null |
Comercio (marca) al que pertenece |
categories |
Category> |
Categorías de producto asignadas |
etaConfig |
EtaConfig\|null |
|
favoriteClients |
Client> |
Clientes que marcaron el producto como favorito |
favorites |
Favorite> |
|
goodCategories |
GoodCategory> |
|
goodProperties |
GoodProperty> |
Propiedades/variantes del producto y sus valores por defecto |
has_barcode |
bool |
Si el producto tiene al menos un código de barras |
limit_description |
string |
Texto legible del límite de compra |
logs |
ApiLog> |
|
materials |
GoodMaterial> |
Combos: productos que lo componen; o insumos para calcular su stock |
orderedGoodProperties |
OrderedGoodProperty> |
|
orderedGoods |
OrderedGood> |
|
presentation |
string |
Texto de presentación para mostrar (ej. "500 Gr") |
properties |
Property> |
Propiedades/variantes del producto |
public_rating_e2 |
int |
Rating mostrado públicamente (suavizado; × 100) |
ratings |
GoodRating> |
|
requirements |
ServiceSkill> |
Habilidades/requisitos que debe cumplir el proveedor (servicios) |
resources |
UploadedResource> |
|
sections |
GoodSection> |
Secciones de home en las que aparece el producto |
tags |
GoodTag> |
Etiquetas del producto (mejoran búsquedas y agrupaciones); $Hot = gestionada por el sistema, más vendidos |
{
"id": 102,
"name": "Un producto de sucursal",
"short_details": "n/a",
"details": "20/04",
"picture_urls": [
"http://127.0.0.1:8000/storage/static/default/product_category_logo.png"
],
"price_e2": 12345600,
"type": 0,
"rating_e2": 0,
"rating_sum": 0,
"rating_count": 0,
"eta": null,
"created_at": "2020-04-20 16:40:49",
"updated_at": "2024-10-27 10:12:03",
"deleted_at": null,
"provider_fee_e2": 0,
"provider_fee_prc": 0,
"sku": null,
"good_type_id": null,
"notes_enabled": false,
"branch_group_id": 42,
"unit": "und",
"max_quantity": null,
"limit_type": null,
"unit_config": null,
"vertical_picture_urls": [
"http://127.0.0.1:8000/storage/static/default/product_category_logo_portrait.jpg"
],
"keywords": [],
"eta_config_id": null,
"weight": null,
"is_type_service": false,
"is_type_custom_pickup": false,
"is_type_digital": false,
"is_type_list": false,
"is_combo": false,
"is_digital_custom": false,
"is_digital_balance": false,
"is_fragile_handling_required": false,
"is_cold_storage_required": false,
"is_liquid_handling_required": false,
"is_large_backpack_required": false,
"barcodes": [],
"label": null,
"presentation": "per_unit"
}
Crear producto (deprecado)
{warning} Endpoint deprecado. Crear el Good desde
branch-groups/{id}/goods.
Crea un Good a nivel de company. No disponible para marketplaces.
| Método | URI | Cabeceras |
|---|---|---|
| POST | /companies/{companyId}/goods |
Authorization |
{
"name": "required|string|max:80",
"short_details": "required|string|max:64",
"details": "required|string",
"price_e2": "required|integer|min:0",
"type": "required|numeric",
"eta": "string|max:32",
"sku": "string|max:16",
"notes_enabled": "boolean",
"unit": "string|max:16",
"eta_config_id": "nullable|integer",
"max_quantity": "integer",
"keywords": [
"string"
],
"limit_type": {
"string": true,
"regex": "/^per_order|per_day|per_week|per_month|per_hours:[1-9][0-9]*$/"
},
"unit_config": {
"enabled": "required_with:unit_config|boolean",
"unit_name": "required_with:unit_config|string|min:1|max:16",
"fraction": "required_with:unit_config|int|min:1|max:1000",
"min_quantity": "required_with:unit_config|int|min:1",
"step_quantity": "required_with:unit_config|int|min:1",
"max_quantity": "required_with:unit_config|int|min:1|gte:min_quantity",
"display_mode": "required_with:unit_config|string|in:decimal,fraction,unit",
"weight_per_unit": "nullable|int"
},
"weight": "nullable|string|max:16",
"is_type_service": "nullable|boolean",
"is_type_custom_pickup": "nullable|boolean",
"is_type_digital": "nullable|boolean",
"is_type_list": "nullable|boolean",
"is_combo": "nullable|boolean",
"is_digital_custom": "nullable|boolean",
"is_digital_balance": "nullable|boolean",
"is_fragile_handling_required": "nullable|boolean",
"is_cold_storage_required": "nullable|boolean",
"is_liquid_handling_required": "nullable|boolean",
"is_large_backpack_required": "nullable|boolean"
}
Crear producto en una sucursal (deprecado)
{warning} Endpoint deprecado. Usar
branch-groups/{branchGroupId}/goods.
Crea un Good y lo asocia a la sucursal.
| Método | URI | Cabeceras |
|---|---|---|
| POST | /companies/{companyId}/branches/{branchId}/goods |
Authorization |
{
"name": "required|string|max:80",
"short_details": "required|string|max:64",
"details": "required|string",
"price_e2": "required|integer|min:0",
"type": "required|numeric",
"eta": "string|max:32",
"sku": "string|max:16",
"notes_enabled": "boolean",
"unit": "string|max:16",
"eta_config_id": "nullable|integer",
"max_quantity": "integer",
"keywords": [
"string"
],
"limit_type": {
"string": true,
"regex": "/^per_order|per_day|per_week|per_month|per_hours:[1-9][0-9]*$/"
},
"unit_config": {
"enabled": "required_with:unit_config|boolean",
"unit_name": "required_with:unit_config|string|min:1|max:16",
"fraction": "required_with:unit_config|int|min:1|max:1000",
"min_quantity": "required_with:unit_config|int|min:1",
"step_quantity": "required_with:unit_config|int|min:1",
"max_quantity": "required_with:unit_config|int|min:1|gte:min_quantity",
"display_mode": "required_with:unit_config|string|in:decimal,fraction,unit",
"weight_per_unit": "nullable|int"
},
"weight": "nullable|string|max:16",
"is_type_service": "nullable|boolean",
"is_type_custom_pickup": "nullable|boolean",
"is_type_digital": "nullable|boolean",
"is_type_list": "nullable|boolean",
"is_combo": "nullable|boolean",
"is_digital_custom": "nullable|boolean",
"is_digital_balance": "nullable|boolean",
"is_fragile_handling_required": "nullable|boolean",
"is_cold_storage_required": "nullable|boolean",
"is_liquid_handling_required": "nullable|boolean",
"is_large_backpack_required": "nullable|boolean"
}
Crear producto en un comercio
Crea un Good dentro del branch_group (marca) indicado. Es la forma recomendada de
dar de alta productos.
| Método | URI | Cabeceras |
|---|---|---|
| POST | /companies/{companyId}/branch-groups/{branchGroupId}/goods |
Authorization |
{
"name": "required|string|max:80",
"short_details": "required|string|max:64",
"details": "required|string",
"price_e2": "required|integer|min:0",
"type": "required|numeric",
"eta": "string|max:32",
"sku": "string|max:16",
"notes_enabled": "boolean",
"unit": "string|max:16",
"eta_config_id": "nullable|integer",
"max_quantity": "integer",
"keywords": [
"string"
],
"limit_type": {
"string": true,
"regex": "/^per_order|per_day|per_week|per_month|per_hours:[1-9][0-9]*$/"
},
"unit_config": {
"enabled": "required_with:unit_config|boolean",
"unit_name": "required_with:unit_config|string|min:1|max:16",
"fraction": "required_with:unit_config|int|min:1|max:1000",
"min_quantity": "required_with:unit_config|int|min:1",
"step_quantity": "required_with:unit_config|int|min:1",
"max_quantity": "required_with:unit_config|int|min:1|gte:min_quantity",
"display_mode": "required_with:unit_config|string|in:decimal,fraction,unit",
"weight_per_unit": "nullable|int"
},
"weight": "nullable|string|max:16",
"is_type_service": "nullable|boolean",
"is_type_custom_pickup": "nullable|boolean",
"is_type_digital": "nullable|boolean",
"is_type_list": "nullable|boolean",
"is_combo": "nullable|boolean",
"is_digital_custom": "nullable|boolean",
"is_digital_balance": "nullable|boolean",
"is_fragile_handling_required": "nullable|boolean",
"is_cold_storage_required": "nullable|boolean",
"is_liquid_handling_required": "nullable|boolean",
"is_large_backpack_required": "nullable|boolean"
}
| Código | HTTP | Cuándo ocurre |
|---|---|---|
EA217 |
400 | El comercio solo admite productos digitales. |
EA219 |
400 | No se especificó la clase digital del producto. |
{info} Soporta: Paginación Filters Carga dinámica
Listar productos
Lista los Good de la company (definiciones de catálogo, sin datos de sucursal).
| Método | URI | Cabeceras |
|---|---|---|
| GET | /companies/{companyId}/goods |
N/A |
Devuelve los proveedores (habilidades de servicio) que pueden atender el Good. Relevante para productos de tipo servicio.
| Método | URI | Cabeceras |
|---|---|---|
| GET | /companies/{companyId}/goods/{goodId}/allowed-providers |
Authorization |
{info} Soporta: Paginación Filters Carga dinámica
Listar productos de una sucursal (deprecado)
{warning} Endpoint deprecado. Usar
branches/{branchId}/branch-goods.
Lista los Good de la sucursal indicada.
| Método | URI | Cabeceras |
|---|---|---|
| GET | /companies/{companyId}/branches/{branchId}/goods |
Authorization |
{info} Soporta: Paginación Filters Carga dinámica
Listar productos de un comercio
Lista los Good del branch_group (marca) indicado.
| Método | URI | Cabeceras |
|---|---|---|
| GET | /companies/{companyId}/branch-groups/{branchGroupId}/goods |
Authorization |
{info} Soporta: Paginación Filters Carga dinámica
Listar productos de una categoría en una sucursal
Lista los Good de la sucursal que pertenecen a la Category indicada.
| Método | URI | Cabeceras |
|---|---|---|
| GET | /companies/{companyId}/branches/{branchId}/categories/{categoryId}/goods |
Authorization |
Listar productos de una etiqueta
Devuelve los Good que tienen el GoodTag indicado.
| Método | URI | Cabeceras |
|---|---|---|
| GET | /companies/{companyId}/good-tags/{tagId}/goods |
Authorization |
{info} Soporta: Paginación Filters Carga dinámica
Devuelve los Good marcados como favoritos por el cliente.
| Método | URI | Cabeceras |
|---|---|---|
| GET | /companies/{companyId}/clients/{clientId}/favorites |
Authorization |
{info} Soporta: Paginación Filters Carga dinámica
Listar productos de una propiedad
Devuelve los Good que usan la Property indicada.
| Método | URI | Cabeceras |
|---|---|---|
| GET | /companies/{companyId}/properties/{propertyId}/goods |
Authorization |
{info} Soporta: Paginación Carga dinámica Filters
Listar productos de un tipo
Devuelve los Good asignados al GoodType indicado.
| Método | URI | Cabeceras |
|---|---|---|
| GET | /companies/{companyId}/good-types/{goodTypeId}/goods |
N/A |
{info} Soporta: Carga dinámica
Mostrar producto
Devuelve el Good (definición de catálogo). Para el precio y stock por sucursal, usar BranchGood.
| Método | URI | Cabeceras |
|---|---|---|
| GET | /companies/{companyId}/goods/{goodId} |
N/A |
Actualizar producto
Actualiza el Good. Cambiar el tipo (type) tiene restricciones: no se puede pasar
de/hacia servicio si tiene habilidades de proveedor asociadas, ni quitar el flag "de lista"
si tiene propiedades o categorías de lista asociadas.
| Método | URI | Cabeceras |
|---|---|---|
| PATCH | /companies/{companyId}/goods/{goodId} |
Authorization |
{
"name": "string|max:80",
"short_details": "string|max:64",
"details": "string",
"price_e2": "integer|min:0",
"type": "numeric",
"eta": "string|max:32",
"sku": "string|max:16",
"notes_enabled": "boolean",
"provider_fee_e2": "integer",
"provider_fee_prc": "numeric|between:0.0000,1.0000",
"unit": "string|max:16",
"max_quantity": "integer",
"eta_config_id": "nullable|integer",
"keywords": [
"string"
],
"limit_type": {
"string": true,
"regex": "/^per_order|per_day|per_week|per_month|per_hours:[1-9][0-9]*$/"
},
"unit_config": {
"enabled": "required_with:unit_config|boolean",
"unit_name": "required_with:unit_config|string|min:1|max:16",
"fraction": "required_with:unit_config|int|min:1|max:1000",
"min_quantity": "required_with:unit_config|int|min:1",
"step_quantity": "required_with:unit_config|int|min:1",
"max_quantity": "required_with:unit_config|int|min:1|gte:min_quantity",
"display_mode": "required_with:unit_config|string|in:decimal,fraction,unit",
"weight_per_unit": "nullable|int"
},
"weight": "nullable|string|max:16",
"is_type_service": "nullable|boolean",
"is_type_custom_pickup": "nullable|boolean",
"is_type_digital": "nullable|boolean",
"is_type_list": "nullable|boolean",
"is_combo": "nullable|boolean",
"is_digital_custom": "nullable|boolean",
"is_digital_balance": "nullable|boolean",
"is_fragile_handling_required": "nullable|boolean",
"is_cold_storage_required": "nullable|boolean",
"is_liquid_handling_required": "nullable|boolean",
"is_large_backpack_required": "nullable|boolean"
}
| Código | HTTP | Cuándo ocurre |
|---|---|---|
EE100 |
400 | No se puede cambiar el tipo: el producto tiene habilidades de proveedor asociadas. |
EA201 |
400 | No se puede quitar el tipo "de lista": tiene categorías de lista asociadas. |
EA203 |
400 | No se puede quitar el tipo "de lista": tiene propiedades asociadas. |
EA217 |
400 | El comercio solo admite productos digitales. |
EA219 |
400 | No se especificó la clase digital del producto. |
Agrega el Good a los favoritos del cliente.
| Método | URI | Cabeceras |
|---|---|---|
| PUT | /companies/{companyId}/clients/{clientId}/goods/{goodId}/favorites |
Authorization |
{
"in_order": "integer|min:1"
}
Agregar productos a una categoría
Suma los Good indicados a la Category sin quitar los existentes.
| Método | URI | Cabeceras |
|---|---|---|
| POST | /companies/{companyId}/categories/{categoryId}/goods |
Authorization |
[
"integer"
]
Vincula el Good con un GoodType (clasificación transversal).
| Método | URI | Cabeceras |
|---|---|---|
| PUT | /companies/{companyId}/goods/{goodId}/good-types/{goodTypeId} |
Authorization |
Vincula otro Good como material del producto: componente si es combo (is_combo), o
insumo para el cálculo de stock si no lo es.
| Método | URI | Cabeceras |
|---|---|---|
| PUT | /companies/{companyId}/goods/{goodId}/materials/{materialId} |
Authorization |
{
"quantity_real": "required|integer|min:1",
"extras": "array"
}
| Código | HTTP | Cuándo ocurre |
|---|---|---|
EA220 |
400 | El material no se puede vincular a este producto. |
Quita el Good de los favoritos del cliente.
| Método | URI | Cabeceras |
|---|---|---|
| DELETE | /companies/{companyId}/clients/{clientId}/goods/{goodId}/favorites |
Authorization |
Quitar productos de una categoría
Quita los Good indicados de la Category.
| Método | URI | Cabeceras |
|---|---|---|
| DELETE | /companies/{companyId}/categories/{categoryId}/goods |
Authorization |
[
"integer"
]
Desvincula el Good del GoodType indicado.
| Método | URI | Cabeceras |
|---|---|---|
| DELETE | /companies/{companyId}/goods/{goodId}/good-types/{goodTypeId} |
Authorization |
Desvincula el Good material del producto.
| Método | URI | Cabeceras |
|---|---|---|
| DELETE | /companies/{companyId}/goods/{goodId}/materials/{materialId} |
Authorization |
| Código | HTTP | Cuándo ocurre |
|---|---|---|
EA221 |
400 | El material no está vinculado a este producto. |
Sincronizar productos de una etiqueta
Reemplaza el conjunto de Good asociados al GoodTag por las ids enviadas.
| Método | URI | Cabeceras |
|---|---|---|
| PUT | /companies/{companyId}/good-tags/{tagId}/goods |
Authorization |
[
"integer"
]
Reemplaza la lista de Good favoritos del cliente por las ids enviadas.
| Método | URI | Cabeceras |
|---|---|---|
| POST | /companies/{companyId}/clients/{clientId}/favorites |
Authorization |
[
"integer"
]
Sincronizar productos de una categoría
Reemplaza el conjunto de Good de la Category por las ids enviadas
(el orden en el array define in_order).
| Método | URI | Cabeceras |
|---|---|---|
| PUT | /companies/{companyId}/categories/{categoryId}/goods |
Authorization |
[
"integer"
]
Eliminar producto
Archiva el Good (soft delete). No se puede si sigue ofertado en alguna sucursal.
| Método | URI | Cabeceras |
|---|---|---|
| DELETE | /companies/{companyId}/goods/{goodId} |
Authorization |
| Código | HTTP | Cuándo ocurre |
|---|---|---|
EA208 |
400 | El producto no se puede eliminar porque está asociado a sucursales. |
Restaurar producto
Restaura un Good archivado (soft delete). Acepta los campos de update para
aplicarlos al restaurar.
| Método | URI | Cabeceras |
|---|---|---|
| POST | /companies/{companyId}/goods/{goodId}/restore |
Authorization |
{
"name": "string|max:64"
}
{info} Soporta: Paginación Filters Carga dinámica
Búsqueda de Good por texto (search) con relevancia; acepta latitude_e6 /
longitude_e6 para acotar a los comercios cercanos.
| Método | URI | Cabeceras |
|---|---|---|
| GET | /companies/{companyId}/goods/search |
N/A |
{
"q": "required|string",
"paginate": "nullable|boolean",
"results_mode": "string|in:goods,branch",
"limit": "nullable|integer",
"latitude_e6": "nullable|integer|between:-90000000,90000000",
"longitude_e6": "nullable|integer|between:-180000000,180000000",
"client_id": "nullable|integer",
"category_id": "nullable|integer"
}
{info} Soporta: Carga dinámica
Devuelve imágenes sugeridas para el Good (búsqueda automática por nombre / código), para que un administrador elija una.
| Método | URI | Cabeceras |
|---|---|---|
| GET | /companies/{companyId}/goods/{goodId}/query-images |
N/A |
Agrega una imagen (formato horizontal) a picture_urls del Good (campo image).
| Método | URI | Cabeceras |
|---|---|---|
| POST | /companies/{companyId}/goods/{goodId}/upload-picture |
Authorization |
{
"image": "required_without:url|image|mimes:jpeg,png|max:8192|dimensions:min_width=2160,min_height=1304",
"url": "required_without:image|url|max:1024"
}
Elimina la url indicada de picture_urls del Good. No se puede quitar la última
imagen si el producto está activo en un menú.
| Método | URI | Cabeceras |
|---|---|---|
| POST | /companies/{companyId}/goods/{goodId}/remove-picture |
Authorization |
{
"picture_url": "required|url"
}
Agrega una imagen (formato vertical) a vertical_picture_urls del Good (campo image).
| Método | URI | Cabeceras |
|---|---|---|
| POST | /companies/{companyId}/goods/{goodId}/upload-vertical-picture |
Authorization |
{
"image": "required_without:url|image|mimes:jpeg,png|max:8192|dimensions:min_width=1120,min_height=1400",
"url": "required_without:image|url|max:1024"
}
Elimina la url indicada de vertical_picture_urls del Good.
| Método | URI | Cabeceras |
|---|---|---|
| POST | /companies/{companyId}/goods/{goodId}/remove-vertical-picture |
Authorization |
{
"picture_url": "required|url"
}
Acción de mantenimiento: reprocesa/repara las imágenes del Good (normaliza URLs, regenera versiones faltantes).
| Método | URI | Cabeceras |
|---|---|---|
| POST | /companies/{companyId}/goods/{goodId}/fix-images |
Authorization |
Carga masiva de Good / BranchGood desde un archivo (campo file) para la
sucursal indicada, según el import_config del comercio.
| Método | URI | Cabeceras |
|---|---|---|
| POST | /companies/{companyId}/branches/{branchId}/goods/import |
Authorization |
{
"file": "required|file|mimes:xlsx,xlsm,xltx,xltm,xls,xlt,ods,ots,slk,xml,gnumeric,htm,html,csv,tsv,txt",
"host_image_url": "string",
"host_image_var": "string",
"send_at": "date|after:now",
"mapping": [
"string"
],
"config": [
"string"
],
"category_mapping": [
"string"
],
"send_at_timezone": {
"string": true,
"regex": "/^[\+\-]([0-1][0-9]|2[0-3]):[0-5][0-9]$/"
},
"csv_settings": {
"delimiter": "string",
"enclosure": "string",
"line_ending": "string",
"use_bom": "boolean",
"include_separator_line": "boolean",
"excel_compatibility": "boolean",
"escape_character": "string",
"contiguous": "boolean",
"input_encoding": "string",
"output_encoding": "string"
}
}
Carga masiva de Good desde un archivo (campo file) para el branch_group (marca)
indicado, según su import_config.
| Método | URI | Cabeceras |
|---|---|---|
| POST | /companies/{companyId}/branch-groups/{branchGroupId}/goods/import |
Authorization |
{
"file": "required|file|mimes:xlsx,xlsm,xltx,xltm,xls,xlt,ods,ots,slk,xml,gnumeric,htm,html,csv,tsv,txt",
"host_image_url": "string",
"host_image_var": "string",
"send_at": "date|after:now",
"mapping": [
"string"
],
"config": [
"string"
],
"category_mapping": [
"string"
],
"send_at_timezone": {
"string": true,
"regex": "/^[\+\-]([0-1][0-9]|2[0-3]):[0-5][0-9]$/"
},
"csv_settings": {
"delimiter": "string",
"enclosure": "string",
"line_ending": "string",
"use_bom": "boolean",
"include_separator_line": "boolean",
"excel_compatibility": "boolean",
"escape_character": "string",
"contiguous": "boolean",
"input_encoding": "string",
"output_encoding": "string"
}
}
{info} Soporta: Paginación Filters Carga dinámica
Búsqueda por texto (search) entre los Good del branch_group indicado.
| Método | URI | Cabeceras |
|---|---|---|
| GET | /companies/{companyId}/branch-groups/{branchGroupId}/goods/search |
Authorization |
{
"q": "required|string",
"paginate": "nullable|boolean",
"results_mode": "string|in:goods,branch",
"limit": "nullable|integer",
"latitude_e6": "nullable|integer|between:-90000000,90000000",
"longitude_e6": "nullable|integer|between:-180000000,180000000",
"client_id": "nullable|integer",
"category_id": "nullable|integer"
}
allLogs HasMany ApiLogallowedProviders HasMany ProviderSkillattachedBranches HasMany BranchattachedRequirements HasMany GoodRequirementbranchGoods HasMany BranchGoodbranchGroup BelongsTo BranchGroupcategories HasMany CategoryetaConfig BelongsTo EtaConfigfavoriteClients HasMany Clientfavorites HasMany FavoritegoodCategories HasMany GoodCategorygoodProperties HasMany GoodPropertylogs HasMany ApiLogmaterials HasMany GoodMaterialorderedGoodProperties HasMany OrderedGoodPropertyorderedGoods HasMany OrderedGoodproperties HasMany Propertyratings HasMany GoodRatingrequirements HasMany ServiceSkillsections HasMany GoodSectiontags HasMany GoodTag