---
title: "Crear o editar una promoción"
method: POST
path: "/promos"
tags: ["Promociones"]
---

# Crear o editar una promoción

`POST /promos`

## Request

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

Crea una nueva promoción o actualiza una existente según la presencia del campo `_id` en el body.

- **Sin `_id`:** Se crea una nueva promoción asociada al negocio del usuario autenticado.
- **Con `_id`:** Se actualiza la promoción existente (nombre, tipo, dateSettings, data, isActive).

Tras guardar, se emite un evento de socket `connected` con `productsUpdated: true` a todos
los clientes conectados al negocio.

**Permiso requerido:** `PM_POST` (Crear/Editar)

**Autenticación requerida:** Bearer Token obtenido del campo `tokenCurrent` en el servicio de login.

`Authorization: Bearer {tokenCurrent}`

## Request body

- Promo: Modelo de promoción según promoModel.js
  - `_id` string: ID único de la promoción
  - `business` string: ID del negocio al que pertenece la promoción
  - `name` string, required: Nombre de la promoción
  - `description` string: Descripción de la promoción
  - `type` 'Porcentaje' | 'ProcentajeCantidad' | 'Cantidad', required: Tipo de promoción: Porcentaje | ProcentajeCantidad | Cantidad
  - `dateSettings` object: Configuración de fechas y horarios de la promoción
    - `date` object
      - `start` string, date-time
      - `final` string, date-time
    - `days` string[]: Días activos: L=Lunes, M=Martes, X=Miércoles, J=Jueves, V=Viernes, S=Sábado, D=Domingo
    - `happyHours` object
      - `isHappyHour` boolean
      - `hours` object
        - `hourStart` object
          - `hour` number
          - `minute` number
        - `hourEnd` object
          - `hour` number
          - `minute` number
  - `data` object: Datos de la promoción según su tipo
    - `typePorcentaje` object: Datos para tipo Porcentaje
      - `value` number
    - `typePorcentajeCantidad` object: Datos para tipo ProcentajeCantidad
      - `values` object[]
        - `qtyMin` number
        - `qtyMax` number
        - `value` number
    - `typeCantidad` object: Datos para tipo Cantidad (ej: lleva 3 paga 2)
      - `takeAmount` number
      - `payAmount` number
  - `isActive` boolean: Indica si la promoción está activa
  - `forDigitalMenu` boolean: Indica si aplica para el menú digital
  - `deleted` boolean: Indica si la promoción fue eliminada (soft delete)
  - `createdOn` string, date-time: Fecha de creación
  - `modifiedOn` string, date-time: Fecha de última modificación

## Response `200`

Promoción creada o actualizada exitosamente

- Promo: Modelo de promoción según promoModel.js
  - `_id` string: ID único de la promoción
  - `business` string: ID del negocio al que pertenece la promoción
  - `name` string, required: Nombre de la promoción
  - `description` string: Descripción de la promoción
  - `type` 'Porcentaje' | 'ProcentajeCantidad' | 'Cantidad', required: Tipo de promoción: Porcentaje | ProcentajeCantidad | Cantidad
  - `dateSettings` object: Configuración de fechas y horarios de la promoción
    - `date` object
      - `start` string, date-time
      - `final` string, date-time
    - `days` string[]: Días activos: L=Lunes, M=Martes, X=Miércoles, J=Jueves, V=Viernes, S=Sábado, D=Domingo
    - `happyHours` object
      - `isHappyHour` boolean
      - `hours` object
        - `hourStart` object
          - `hour` number
          - `minute` number
        - `hourEnd` object
          - `hour` number
          - `minute` number
  - `data` object: Datos de la promoción según su tipo
    - `typePorcentaje` object: Datos para tipo Porcentaje
      - `value` number
    - `typePorcentajeCantidad` object: Datos para tipo ProcentajeCantidad
      - `values` object[]
        - `qtyMin` number
        - `qtyMax` number
        - `value` number
    - `typeCantidad` object: Datos para tipo Cantidad (ej: lleva 3 paga 2)
      - `takeAmount` number
      - `payAmount` number
  - `isActive` boolean: Indica si la promoción está activa
  - `forDigitalMenu` boolean: Indica si aplica para el menú digital
  - `deleted` boolean: Indica si la promoción fue eliminada (soft delete)
  - `createdOn` string, date-time: Fecha de creación
  - `modifiedOn` string, date-time: Fecha de última modificación

## Other responses

- `401`: No autorizado - Token JWT inválido o ausente
- `403`: Prohibido - Sin permiso PM_POST
- `500`: Error del servidor al guardar la promoción

---

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