---
title: "Crear o editar un producto"
method: POST
path: "/products"
tags: ["Productos"]
---

# Crear o editar un producto

`POST /products`

## Request

- Base URL: `https://api.pirpos.com`
- URL: `https://api.pirpos.com/products`
- Auth: HTTP bearer

Crea un nuevo producto o actualiza uno existente si se envía `_id`.
Puede incluir subproductos, ingredientes, configuración de combo y configuración por ubicación.

**Autenticación requerida:** Bearer Token.

## Request body

- Product: Modelo de producto según productModel.js
  - `_id` string: ID único del producto
  - `business` string: ID del negocio al que pertenece el producto
  - `category` string: ID de la categoría del producto
  - `name` string: Nombre del producto
  - `nameShort` string: Nombre corto del producto
  - `description` string: Descripción del producto
  - `price` number: Precio base del producto (deprecado)
  - `pricePurchase` number: Costo de compra
  - `urlImage` string: URL de la imagen del producto
  - `barcode` string: Código de barras del producto
  - `tax` string: ID del impuesto
  - `promo` string: ID de la promoción
  - `unit` string: ID de la unidad
  - `stock` number: Stock total
  - `stockMinimum` number: Stock mínimo
  - `variablePrice` object: Configuración de precio variable
    - `isVariablePrice` boolean
    - `type` string: MayorValor|MenorValor
  - `locationsStock` object[]: Configuración por ubicación de stock
    - `locationStock` string: ID de la ubicación
    - `stock` number: Stock en la ubicación
    - `stockMinimum` number: Stock mínimo en la ubicación
    - `isMain` boolean: Ubicación principal
    - `pricePurchase` number: Costo de compra en ubicación
    - `avgCost` number: Costo promedio
    - `price` number: Precio en ubicación
    - `tax` string: ID de impuesto (deprecado)
    - `taxes` object[]: Impuestos por ubicación
      - `tax` string: ID del impuesto
      - `valuePerUnit` number: Valor por unidad
      - `required` boolean: Si es requerido
    - `promo` string: ID de promoción
    - `config` object: Configuración de ubicación
    - `waiterOrderArea` string: ID del área de pedidos
  - `ingredients` object[]: Ingredientes (si aplica)
    - `ingredient` string: ID del producto ingrediente
    - `quantity` number
    - `locationStock` string
    - `isForProduction` boolean
    - `discountOnce` boolean
  - `extra` object[]: Productos extra
    - `product` string
  - `accompanying` object[]: Acompañantes
    - `product` string
    - `quantity` number
  - `subProducts` string[]: Subproductos
  - `parent` string: ID del producto padre
  - `weekdays` number[]: Días de la semana (1-7) en que aplica
  - `notes` string[]: Notas del producto
  - `isIngredient` boolean: Si el producto es un ingrediente
  - `isActive` boolean: Si el producto está activo
  - `isSubproduct` boolean: Si el producto es subproducto
  - `discountInventory` boolean: Si descuenta inventario
  - `withoutIngredients` boolean: Si no maneja ingredientes
  - `inventoryType` string: Tipo de inventario (WithIngredients|PerUnit|Mixed|None)
  - `type` string: Tipo de producto (Normal|Subproducto|Ingrediente|Combo)
  - `configCombo` object: Configuración de combos
    - `options` object[]
      - `selectionType` string
      - `name` string
      - `severalOption` object
        - `min` number
        - `max` number
      - `products` object[]
        - `product` string
        - `quantity` number
      - `unlockSelection` boolean
      - `noShowQty` boolean
    - `showInReports` boolean
  - `waiterOrderArea` string: ID del área de pedidos
  - `externalIntegration` object: Integraciones externas
    - `siigo` object
    - `rappi` object
    - `loggro` object
  - `deleted` boolean: Si el producto está eliminado
  - `deletedInfo` object: Información de eliminación
    - `isDeleted` boolean
    - `deletedBy` string
    - `date` string, date-time
  - `modifiedOn` string, date-time: Fecha de última modificación
  - `createdOn` string, date-time: Fecha de creación

## Response `200`

Producto guardado exitosamente

- Product: Modelo de producto según productModel.js
  - `_id` string: ID único del producto
  - `business` string: ID del negocio al que pertenece el producto
  - `category` string: ID de la categoría del producto
  - `name` string: Nombre del producto
  - `nameShort` string: Nombre corto del producto
  - `description` string: Descripción del producto
  - `price` number: Precio base del producto (deprecado)
  - `pricePurchase` number: Costo de compra
  - `urlImage` string: URL de la imagen del producto
  - `barcode` string: Código de barras del producto
  - `tax` string: ID del impuesto
  - `promo` string: ID de la promoción
  - `unit` string: ID de la unidad
  - `stock` number: Stock total
  - `stockMinimum` number: Stock mínimo
  - `variablePrice` object: Configuración de precio variable
    - `isVariablePrice` boolean
    - `type` string: MayorValor|MenorValor
  - `locationsStock` object[]: Configuración por ubicación de stock
    - `locationStock` string: ID de la ubicación
    - `stock` number: Stock en la ubicación
    - `stockMinimum` number: Stock mínimo en la ubicación
    - `isMain` boolean: Ubicación principal
    - `pricePurchase` number: Costo de compra en ubicación
    - `avgCost` number: Costo promedio
    - `price` number: Precio en ubicación
    - `tax` string: ID de impuesto (deprecado)
    - `taxes` object[]: Impuestos por ubicación
      - `tax` string: ID del impuesto
      - `valuePerUnit` number: Valor por unidad
      - `required` boolean: Si es requerido
    - `promo` string: ID de promoción
    - `config` object: Configuración de ubicación
    - `waiterOrderArea` string: ID del área de pedidos
  - `ingredients` object[]: Ingredientes (si aplica)
    - `ingredient` string: ID del producto ingrediente
    - `quantity` number
    - `locationStock` string
    - `isForProduction` boolean
    - `discountOnce` boolean
  - `extra` object[]: Productos extra
    - `product` string
  - `accompanying` object[]: Acompañantes
    - `product` string
    - `quantity` number
  - `subProducts` string[]: Subproductos
  - `parent` string: ID del producto padre
  - `weekdays` number[]: Días de la semana (1-7) en que aplica
  - `notes` string[]: Notas del producto
  - `isIngredient` boolean: Si el producto es un ingrediente
  - `isActive` boolean: Si el producto está activo
  - `isSubproduct` boolean: Si el producto es subproducto
  - `discountInventory` boolean: Si descuenta inventario
  - `withoutIngredients` boolean: Si no maneja ingredientes
  - `inventoryType` string: Tipo de inventario (WithIngredients|PerUnit|Mixed|None)
  - `type` string: Tipo de producto (Normal|Subproducto|Ingrediente|Combo)
  - `configCombo` object: Configuración de combos
    - `options` object[]
      - `selectionType` string
      - `name` string
      - `severalOption` object
        - `min` number
        - `max` number
      - `products` object[]
        - `product` string
        - `quantity` number
      - `unlockSelection` boolean
      - `noShowQty` boolean
    - `showInReports` boolean
  - `waiterOrderArea` string: ID del área de pedidos
  - `externalIntegration` object: Integraciones externas
    - `siigo` object
    - `rappi` object
    - `loggro` object
  - `deleted` boolean: Si el producto está eliminado
  - `deletedInfo` object: Información de eliminación
    - `isDeleted` boolean
    - `deletedBy` string
    - `date` string, date-time
  - `modifiedOn` string, date-time: Fecha de última modificación
  - `createdOn` string, date-time: Fecha de creación

## Other responses

- `400`: No tienes una suscripción activa o límite de productos alcanzado
- `401`: No autorizado
- `500`: Error interno del servidor

---

[API](https://skmtc.dev/loggro/apis/restobar-servicios-del-m-dulo-de-restobar.md) - [All operations](https://skmtc.dev/loggro/apis/restobar-servicios-del-m-dulo-de-restobar/llms.txt) - [OpenAPI document](https://skmtc.dev/loggro/apis/restobar-servicios-del-m-dulo-de-restobar/revisions/9d4431a3cddc?raw)
