POST
/api/mod/productos/{espacio}/price-quoteCotiza un carrito
Le das las variantes y cantidades; te devuelve el precio de cada línea, las promociones que aplican, el total y una huella de los datos usados. Las cifras salen siempre de aquí, nunca estimadas.
- PERMISOescribe
- CRÉDITOSno gasta
- AUTENTICACIÓNBearer bth_…
PARÁMETROS
| CAMPO | TIPO | REQUERIDO | QUÉ ES |
|---|---|---|---|
| espacio | string | SÍ | El id del espacio (sale en GET /api/companies). Tiene que tener el módulo Productos. |
CUERPO · JSON
| CAMPO | TIPO | REQUERIDO | QUÉ ES |
|---|---|---|---|
| lineas | [{ variant_id, cantidad }] | SÍ | Al menos una. cantidad, por defecto 1. |
| moneda | string | no | Solo cotizan los precios en esta moneda. Por defecto "COP". |
| fecha | string | no | Para qué momento, en ISO 8601. Por defecto, ahora. |
| codigos_promo | string[] | no | Los códigos que escribió tu cliente. |
| canal | string | no | Por dónde compra, para las promociones que lo miran. Por defecto "chat". |
RESPUESTA 200
| CAMPO | TIPO | QUÉ ES |
|---|---|---|
| lineas[].variant_id · sku | string | La variante cotizada. |
| lineas[].nombre | string | El nombre de su producto. |
| lineas[].cantidad | string | La cantidad. |
| lineas[].precio_unitario | string | El precio que ganó. |
| lineas[].adjustments[] | { promotion_id, regla, target, monto } | Cada descuento de la línea: la promoción, su nombre, item u order, y el importe en negativo. |
| lineas[].total_linea | string | precio_unitario × cantidad, menos sus descuentos. |
| subtotal | string | La suma antes de descuentos. |
| descuento_total | string | Lo descontado, en positivo. |
| total | string | Lo que se cobra. Nunca menos de 0. |
| moneda | string | La de la cotización. |
| catalog_version | string | Huella de los precios, promociones y catálogo usados. Dos cotizaciones con la misma salieron de los mismos datos. |
| no_cotizados | string[] | Los variant_id que no se pudieron cotizar: no existen, no tienen precio vigente en esa moneda o la cantidad no es mayor que 0. |
ERRORES DE ESTA RUTA · SIEMPRE {"detail": …}
| STATUS | CUÁNDO | DETAIL LITERAL |
|---|---|---|
| 403 | El espacio no tiene el módulo Productos | módulo no habilitado para este espacio. |
| 403 | La clave es de solo lectura | Tu cuenta es de solo lectura en este espacio. |
| 400 | lineas viene vacía | el carrito no tiene líneas. |
| 422 | Falta un campo obligatorio o uno no es de su tipo (detail es una lista) | — |
Y los de cualquier ruta —clave inválida, cuenta no al día, IP, límites—, en Errores, límites y créditos.
CONVIENE SABER
- No cambia nada ni gasta usos de las promociones, pero es un POST: pide clave escribe.
- Una línea sin precio no se cobra a 0: sale en
no_cotizadosy no suma al total. - Guarda
catalog_versioncon el pedido: dice con qué precios se cotizó. - Las cantidades y los importes viajan como texto decimal (
"32000","1.5") para no perder precisión. Al mandarlos vale un número o un texto.