POST
/api/mod/ventas/{espacio}/pricing/quoteCotiza un envío
La misma cotización que hace el agente, sin conversación: tarifa, días de entrega y recargos de la tabla activa para un destino, un producto y una cantidad.
- 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 Ventas. |
CUERPO · JSON
| CAMPO | TIPO | REQUERIDO | QUÉ ES |
|---|---|---|---|
| destino | string | SÍ | La ciudad o la zona, en texto libre. Da igual mayúsculas o tildes. |
| producto | string | no | El producto, si la tabla tiene tarifas por producto. |
| cantidad | integer | no | Por defecto 1. |
| session_id | string | no | Una conversación, para que la cotización quede asociada en el registro. |
RESPUESTA 200
Siempre 200: una cotización o el motivo por el que no se pudo.
| CAMPO | TIPO | QUÉ ES |
|---|---|---|
| ok | boolean | true si cotizó. |
| cotizacion.total | string | Lo que cuesta el envío con sus recargos, texto decimal con 2 decimales. |
| cotizacion.coste_envio | string | La tarifa de envío sola. |
| cotizacion.recargos[] | { concepto, monto, base_normativa } | Los recargos que aplicaron. |
| cotizacion.tiempo_entrega_dias | [min, max] | Los días de entrega. |
| cotizacion.zona_id · producto_id | string | La zona y el producto que reconoció. producto_id vacío si no diste uno. |
| cotizacion.vigencia | string | null | Hasta cuándo vale la tarifa usada, si tiene fecha. |
| cotizacion.tarifa_version | string | La huella (sha256) de la tabla con la que cotizó. |
| error | { code, message, detail, candidates } | Si no cotizó: ver códigos. |
CÓDIGOS DE ERROR DE COTIZACIÓN
| CAMPO | TIPO | QUÉ ES |
|---|---|---|
| missing_slot | repreguntar | Falta el destino. |
| ambiguous_destination | repreguntar | El destino coincide con varias zonas: candidates trae sus nombres. |
| quantity_out_of_range | repreguntar | Ninguna fila cubre esa cantidad. |
| no_zone_for_destination | persona | Ninguna zona reconoce ese destino. |
| unknown_product | persona | Diste un producto que la tabla no conoce. |
| no_rate | persona | Hay zona, pero ninguna fila para esa zona y ese producto. |
| rate_expired | persona | La fila que aplica está vencida (vigente_hasta ya pasó): detail trae la fecha. |
| no_active_table | persona | No hay ninguna versión validada. |
ERRORES DE ESTA RUTA · SIEMPRE {"detail": …}
| STATUS | CUÁNDO | DETAIL LITERAL |
|---|---|---|
| 403 | El espacio no tiene el módulo Ventas | módulo no habilitado para este espacio. |
| 403 | La clave es de solo lectura | Tu cuenta es de solo lectura en este espacio. |
| 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
- Pide una clave
escribe, aunque no cambie nada: cada cotización queda registrada. - Cotiza con tus tablas, no con el módulo Comercial: si tu espacio usa Comercial, esta ruta no refleja lo que cotiza el agente.