Skip to main content
PUT
/
api
/
productos
/
{id}
Actualizar Producto
curl --request PUT \
  --url https://api.example.com/api/productos/{id} \
  --header 'Authorization: <authorization>' \
  --header 'Content-Type: <content-type>' \
  --data '
{
  "nombre": "<string>",
  "descripcion": "<string>",
  "codigo": "<string>",
  "cod_barra": "<string>",
  "categoria_id": 123,
  "unidad_id": 123,
  "precio": 123,
  "precio_unidad": 123,
  "precio_mayor": 123,
  "precio_menor": 123,
  "costo": 123,
  "moneda": "<string>",
  "cantidad": 123,
  "stock_minimo": 123,
  "stock_maximo": 123,
  "codsunat": "<string>",
  "usar_barra": true,
  "usar_multiprecio": true
}
'
{
  "404": {},
  "422": {},
  "500": {},
  "success": true,
  "message": "<string>",
  "data": {},
  "sincronizado": true
}
Actualiza la información de un producto existente. Permite modificar precios, stock, categoría, unidad e imagen.

Autenticación

Requiere token Bearer y permiso productos.edit.

Headers

Authorization
string
required
Token de autenticación Bearer
Content-Type
string
required
multipart/form-data (si se incluye imagen) o application/json

Path Parameters

id
integer
required
ID del producto a actualizar

Body Parameters

Todos los campos son opcionales. Solo se actualizan los campos enviados.

Información Básica

nombre
string
Nombre del producto
descripcion
string
Descripción del producto
codigo
string
Código interno del producto
cod_barra
string
Código de barras

Categorización

categoria_id
integer
ID de la categoría
unidad_id
integer
ID de la unidad de medida

Precios

precio
decimal
Precio de venta unitario
precio_unidad
decimal
Precio por unidad
precio_mayor
decimal
Precio mayorista
precio_menor
decimal
Precio minorista
costo
decimal
Costo de adquisición
moneda
string
Moneda: PEN o USD

Stock

cantidad
integer
Stock actual del producto
stock_minimo
integer
Stock mínimo de alerta
stock_maximo
integer
Stock máximo recomendado

Configuración

codsunat
string
Código del catálogo SUNAT
usar_barra
boolean
Si utiliza código de barras
usar_multiprecio
boolean
Si tiene múltiples niveles de precio
imagen
file
Nueva imagen del producto. Si se proporciona, reemplaza la imagen anterior.
IMPORTANTE: No puedes cambiar el campo almacen de un producto existente. Si necesitas mover un producto a otro almacén, debes crear uno nuevo.

Respuesta Exitosa

success
boolean
true si el producto se actualizó exitosamente
message
string
“Producto actualizado exitosamente”
data
object
Producto actualizado con sus relaciones
sincronizado
boolean
Siempre false en esta implementación. Campo legacy para compatibilidad.

Ejemplo de Solicitud

{
  "nombre": "Mouse Inalámbrico Logitech M720 Triathlon",
  "precio": 125.00,
  "precio_mayor": 115.00,
  "costo": 88.00,
  "cantidad": 75,
  "stock_minimo": 15,
  "usar_multiprecio": true
}

Ejemplo de Respuesta

{
  "success": true,
  "message": "Producto actualizado exitosamente",
  "data": {
    "id_producto": 456,
    "codigo": "PROD-A1-00123",
    "nombre": "Mouse Inalámbrico Logitech M720 Triathlon",
    "precio": 125.00,
    "precio_mayor": 115.00,
    "costo": 88.00,
    "cantidad": 75,
    "stock_minimo": 15,
    "usar_multiprecio": true,
    "categoria": {
      "id": 15,
      "nombre": "PERIFÉRICOS"
    },
    "unidad": {
      "id": 3,
      "nombre": "UNIDAD",
      "codigo": "NIU"
    }
  },
  "sincronizado": false
}

Actualización de Imagen

Si envías una nueva imagen:
  1. La imagen anterior se elimina automáticamente de storage/app/public/productos/
  2. La nueva imagen se guarda con formato: {timestamp}_{nombre_original}
  3. El campo imagen se actualiza con la nueva ruta

Códigos de Error

404
error
Producto no encontrado
422
error
Errores de validación de datos
500
error
Error interno al actualizar el producto

Actualización de Stock

IMPORTANTE: Actualizar el campo cantidad directamente modifica el stock sin generar movimientos de auditoría. Para cambios de stock con trazabilidad, usa los endpoints de movimientos de stock o crea ajustes mediante compras/ventas.
Para gestionar stock con trazabilidad:
  • Entrada de stock: Registra una compra (POST /api/compras)
  • Salida de stock: Registra una venta con afecta_stock = true
  • Consultar movimientos: GET /api/movimientos-stock?id_producto={id}

Notas de Implementación

  • Solo se actualizan los campos enviados en el request (actualización parcial)
  • El campo updated_at se actualiza automáticamente
  • Las relaciones (categoria y unidad) se recargan después de la actualización
  • Para eliminar (soft delete) un producto, usa: DELETE /api/productos/{id}

Build docs developers (and LLMs) love