Good


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.

Tipo de producto (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).
  • Manejo especial en el reparto: is_fragile_handling_required, is_cold_storage_required, is_liquid_handling_required, is_large_backpack_required.

Códigos y jerarquía de catálogo

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

Materiales (materials)

  • Si is_combo es true: materials son los productos que componen el combo.
  • Si 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.

Límites de compra

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.

Estructura de Datos

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"
}

Endpoints

Insertar Good

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"
}

Insertar Good de Branch

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"
}

Insertar Good de BranchGroup

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"
}

Errores de negocio

Código HTTP Cuándo ocurre
EA217 400 El comercio solo admite productos digitales.
EA219 400 No se especificó la clase digital del producto.

Listar Good

{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

Listar proveedores habilitados para un producto

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

Listar Good de Branch

{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

Listar Good de BranchGroup

{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

Listar Good de Category

{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 Good de GoodTag

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

Listar favoritos de un cliente

{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

Listar Good de Property

{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

Listar Good de GoodType

{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

Mostrar Good

{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 Good

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"
}

Errores de negocio

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.

Vincular Good

Marcar producto como favorito

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"
}

Vincular Good de Category

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"
]

Asignar tipo a un producto

Vincula el Good con un GoodType (clasificación transversal).

Método URI Cabeceras
PUT /companies/{companyId}/goods/{goodId}/good-types/{goodTypeId} Authorization

Agregar material a un producto

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"
}

Errores de negocio

Código HTTP Cuándo ocurre
EA220 400 El material no se puede vincular a este producto.

Desvincular Good

Quitar producto de favoritos

Quita el Good de los favoritos del cliente.

Método URI Cabeceras
DELETE /companies/{companyId}/clients/{clientId}/goods/{goodId}/favorites Authorization

Desvincular Good de Category

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"
]

Quitar tipo de un producto

Desvincula el Good del GoodType indicado.

Método URI Cabeceras
DELETE /companies/{companyId}/goods/{goodId}/good-types/{goodTypeId} Authorization

Quitar material de un producto

Desvincula el Good material del producto.

Método URI Cabeceras
DELETE /companies/{companyId}/goods/{goodId}/materials/{materialId} Authorization

Errores de negocio

Código HTTP Cuándo ocurre
EA221 400 El material no está vinculado a este producto.

Sincronizar Good

Sincronizar Good de GoodTag

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"
]

Sincronizar favoritos de un cliente

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 Good de Category

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 Good

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

Errores de negocio

Código HTTP Cuándo ocurre
EA208 400 El producto no se puede eliminar porque está asociado a sucursales.

Restaurar Good

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"
}

Acciones de Good

Buscar productos

{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"
}

Buscar imágenes candidatas para un producto

{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

Subir imagen del producto

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"
}

Quitar imagen del producto

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"
}

Subir imagen vertical del producto

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"
}

Quitar imagen vertical del producto

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"
}

Reparar imágenes del producto

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

Importar catálogo a una sucursal

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"
    }
}

Importar catálogo a un comercio

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"
    }
}

Buscar productos de un comercio

{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"
}

Relaciones