Generar pedido
Permite generar un pedido en AveCRM con validación automática de inventario, cálculo de envío y generación de guía. El sistema soporta dropshipping, fulfillment y múltiples formas de envío. Los productos deben estar previamente registrados. Si no se especifica el operador logístico, el sistema selecciona automáticamente el más económico.
Request 🚀
url
https://app.aveonline.co/avestock/api/createOrder.php
Method
POST
Header
Content-Type: application/json
Params JSON
Autenticación (requeridos)
- tipo*
StringEnrutador de la API: "authave" - token*
StringToken recibido en la [Autenticación](./autenticacion) con vigencia de una hora - empresa*
NumberIdentificador de la empresa dentro de AVEONLINE
Identificación del Pedido
- numeropedidoExterno
StringNúmero de pedido asociado a tienda, POS, ERP, etc. Validado contra duplicados - lucidsalesOrderId
StringID de orden de LucidSales (si aplica)
Origen del Pedido
- bodegaName
NumberID de la bodega desde donde se realiza el envío. Si no se envía, se selecciona automáticamente - idAgente
NumberID del canal de venta o agente. Si no se envía, el sistema resuelve bodega según reglas internas. [Listado de canales de ventas](./listadocanalesVentas) - proveedorName
NumberID del proveedor para pedidos de dropshipping
Productos - Opción 1: Array de items (payload preferido)
- items
Array<Object>Lista de productos del pedido- productRef*
StringCódigo/referencia del producto - quantity*
NumberCantidad del producto - rateValue
NumberValor unitario. Si no se envía, se toma del sistema - ivaValue
NumberValor del IVA unitario - peso
NumberPeso unitario (Kg). Si no se envía, se toma del sistema - vol
NumberVolumen unitario. Si no se envía, se toma del sistema - declarado
NumberValor declarado unitario. Si no se envía, se toma del sistema - totalValue
NumberValor total del ítem. Si no se envía, se calcula automáticamente - descuentoValue
NumberValor de descuento del producto - descuento
FloatPorcentaje de descuento (ej: 10.50) - numerodescuento
NumberDescuento en valor absoluto
- productRef*
Productos - Opción 2: Arrays paralelos (para formularios / legacy)
- productName
Array<String>Array de nombres/IDs de productos - quantity
Array<Number>Array de cantidades (debe coincidir con productName) - rateValue
Array<Number>Array de valores unitarios - ivaValue
Array<Number>Array de valores de IVA - peso
Array<Number>Array de pesos - vol
Array<Number>Array de volúmenes - declarado
Array<Number>Array de valores declarados
Recomendación: usa siempre
items(array de objetos) cuando consumas la API en JSON. Es el formato preferido para integraciones backend/backend y evita desalineaciones entre arrays.Usa arrays paralelos solo cuando tu origen de datos venga de formularios o estructuras legacy que ya entregan campos separados por columna.
Totales del Pedido (si no se envían, se calculan automáticamente)
- subTotalValue
NumberSubtotal antes de impuestos - vatValue
NumberTotal de impuestos - totalAmountValue
NumberTotal del pedido sin envío - grandTotalValue
NumberTotal general del pedido - grandTotalPeso
NumberPeso total (Kg) - grandTotalVol
NumberVolumen total - grandTotalUnit
NumberTotal de unidades - grandTotalDeclarado
NumberValor declarado total - grandDescuentoValue
NumberTotal de descuentos - orderDiscount
NumberDescuento aplicado sobre todo el pedido antes del IVA
Datos del Cliente Destinatario
- clientDestino*
StringCiudad de destino: 'CIUDAD(DEPARTAMENTO)' o código DANE de 5+ dígitos - clientContact*
StringNombre del destinatario - clientId
StringIdentificación del destinatario. Requerido cuando recaudo o recaudoValue es mayor a 0 - clientDir
StringDirección del destinatario. Si está vacía, el pedido queda en novedad - clientTel
StringTeléfono del destinatario - clientEmail
StringCorreo electrónico del destinatario - clientName
NumberID del cliente (uso interno)
Configuración del Envío
- seloperadorEnvio
NumberID del operador logístico. Si es 0, se selecciona el más económico automáticamente - valorEnvio
NumberValor del envío (si ya fue cotizado previamente) - valorEnvioValue
NumberAlias de valorEnvio - cadenaEnvio
StringDatos adicionales del envío (JSON string) - diasEntrega
NumberDías de entrega estimados
Configuración de Pago y Recaudo
- paymentCliente
Number¿Cliente paga el transporte? (1=SI, 2=NO) - recaudo
NumberValor a recaudar del pedido. Si es mayor a 0,pagadose marca como 2 - recaudoValue
NumberAlias de recaudo - paymentAsumecosto
Number¿Cliente asume costo del recaudo? (1=SI, 2=NO) - pagado
NumberEstado de pago: 1=Pagado desde canal de venta, 2=No pagado - metodo_pago
NumberID del método de pago utilizado - plazo_pago
NumberPlazo de pago en días
Configuración del Proceso
- noGenerarEnvio
Number1=No genera guía automáticamente. Se debe generar después manualmente - revisarCE
String"1"=Pedido requiere confirmación (contraentrega). No genera guía hasta confirmar - enviopropio
BooleanIndica envío propio - plugin
StringIdentificador del método de acceso. Por defecto "aveonline"
Comportamiento validado del endpoint
- Si
tipo = "authave", el endpoint entra en modo API y registra trazas enorder_api_logs. - El payload preferido para API es
itemscomo array de objetos. - El formato de arrays paralelos (
productName,quantity, etc.) se mantiene para formularios/legacy. - Para
recaudo > 0,pagadosiempre se normaliza a no pagado en backend. - Si existe
numeropedidoExternoen proceso reciente (1 minuto), responde conflicto. - Si
numeropedidoExternoya existe para la empresa (y agente cuando aplica), responde conflicto. - Si la orden queda con novedad (dirección, ciudad, sin producto, sin stock), no genera guía automática.
revisarCE = 1fuerza que no se genere guía hasta confirmar.
Datos Adicionales
- obs
StringObservaciones del envío ("dice contener"). Si está vacío, se genera automáticamente con los productos - observacion
StringAlias de obs - notas
StringNotas internas del pedido - nroFactura
StringNúmero de factura interna - calificacion
Array<Object>Calificaciones asociadas al pedido - otros_items
Array<Object>Items adicionales (ej: costos de empaque)
Configuración Avanzada
- debug
Number1=Modo debug (registra información adicional) - noSocket
Booleantrue=No envía notificación por socket - extra_data
ObjectDatos extra como reputación IA- ia_dir_reputation
ObjectDatos de reputación de dirección por IA
- ia_dir_reputation
Ejemplos de Payload
Payload preferido (JSON con items)
{
"tipo": "authave",
"obs": null,
"idAgente": 17154,
"numeropedidoExterno": "#196551",
"empresa": 25505,
"items": [
{
"vol": null,
"peso": null,
"ivaValue": null,
"quantity": 1,
"declarado": null,
"rateValue": 0,
"productRef": "2550549248",
"totalValue": null,
"pordescuento": 0
}
],
"plugin": "aveonline",
"recaudo": 0,
"clientId": "71889000",
"vatValue": null,
"clientDir": "CR 47 # 35 SUR 20 El Portal",
"clientTel": "573002001513",
"revisarCE": 1,
"bodegaName": null,
"nroFactura": null,
"valorEnvio": null,
"cadenaEnvio": null,
"clientEmail": "jsgil@lagilco.com",
"recaudoValue": 0,
"clientContact": "Juan Sebastian Gil",
"clientDestino": "MEDELLIN(ANTIOQUIA)",
"grandTotalVol": null,
"subTotalValue": null,
"grandTotalPeso": null,
"grandTotalUnit": null,
"noGenerarEnvio": 1,
"paymentCliente": 2,
"grandTotalValue": null,
"valorEnvioValue": null,
"seloperadorEnvio": null,
"totalAmountValue": null,
"paymentAsumecosto": 2,
"grandTotalDeclarado": null,
"grandTotalDeclaradoValue": null,
"pagado": true
}
Payload alternativo (arrays paralelos para formularios)
{
"empresa": 6077,
"idAgente": 10961,
"numeropedidoExterno": "TEST-GUIA-ATADA-177446041543",
"productRef": [
"2"
],
"productName": [
"2"
],
"quantity": [
"1"
],
"rateValue": [
"18000"
],
"ivaValue": [
"3420"
],
"peso": [
"1"
],
"vol": [
"0"
],
"declarado": [
"21420"
],
"subTotalValue": 18000,
"vatValue": 3420,
"totalAmountValue": 21420,
"grandTotalValue": 21420,
"grandTotalPeso": 1,
"grandTotalUnit": 1,
"grandTotalDeclarado": 21420,
"clientDestino": "BOGOTA(CUNDINAMARCA)",
"clientContact": "Test Guia Atada",
"clientId": "900000003",
"clientDir": "Cra 10 # 10-10",
"clientTel": "3001234570",
"clientEmail": "test@test.com",
"seloperadorEnvio": 33,
"noGenerarEnvio": 0
}
Response 📄
Success
Datos Principales
- success
Booleantrue si el pedido se creó exitosamente - order_id
StringNúmero consecutivo de la orden generada - id
NumberID único de la orden en la base de datos - messages
StringMensaje descriptivo del resultado
Información del Transporte
- valortransporte
NumberValor estimado del transporte (puede cambiar al confirmar) - diasEntrega
NumberDías de entrega estimados - kilosenvios
NumberPeso (Kg) utilizado para calcular el costo de transporte - operador
StringNombre del operador logístico seleccionado. Vacío si enviopropio=true
Información de la Bodega
- bodegaContact
StringNombre de la bodega - bodegaId
StringNIT de la bodega - bodegaTel
StringTeléfono de la bodega - bodegaDir
StringDirección de la bodega - bodegaEmail
StringEmail de la bodega - bodega_usuario
NumberID del usuario asociado a la bodega - bodega_id
NumberID de la bodega en el sistema - bodegaOrigen
StringCiudad origen de la bodega
Operadores Disponibles
- dataoperadores
Array<Object>Lista de operadores cotizados (vacío si enviopropio=true)- status
NumberEstado de la cotización (1=exitoso) - message
StringMensaje de la cotización - flete
NumberValor del flete - variable
NumberCosto de manejo - comision
NumberCosto del recaudo - total
NumberValor total del operador - campo
NumberID del operador - transportadora
StringNombre del operador - diasentrega
NumberDías de entrega - stringdata
StringCadena con datos completos de la cotización
- status
Estado del Pedido
- order_status
NumberID del estado del pedido - order_status_name
StringNombre del estado del pedido - log
StringRegistro del log de estado creado
Novedades (si existen)
- novelties
Array<Object>Lista de novedades detectadas- status
NumberID del estado de novedad - message
StringDescripción de la novedad - priority
NumberPrioridad de la novedad
- status
- novelties_count
NumberCantidad de novedades detectadas - all_novelty_logs
Array<String>Logs de todas las novedades registradas
Generación de Guía
- guide
ObjectResultado del proceso de generación de guía (si aplica)- success
Booleantrue si la guía se generó exitosamente - Otros campos según el operador
- success
Totales Calculados
- totalAmount
NumberTotal del pedido calculado
Integraciones
- linea_estandar_message
ObjectResultado del envío de mensaje WhatsApp- status
Stringsuccess|error - message
StringMensaje de resultado - result
ObjectRespuesta completa del servicio (cuando aplica)
- status
Ejemplo
{
"success": true,
"order_id": "0000000",
"messages": "Pedido 0000000 Agregado exitosamente.",
"valortransporte": 00000,
"id": 116056,
"diasEntrega": 3,
"kilosenvios": 1,
"operador": "DOMINA",
"bodegaContact": "",
"bodegaId": "",
"bodegaTel": "",
"bodegaDir": "",
"bodegaEmail": "",
"bodega_usuario": "",
"bodega_id": "",
"bodegaOrigen": "",
"databodegas": [
{
"bodega_id": "0000",
"bodega_nombre": "BODEGA PRUEBA",
"dataoperadores": [
{
"status": 1,
"message": "Datos recibidos",
"flete": 10820,
"variable": 0,
"comision": 1946,
"total": 12766,
"campo": 1026,
"transportadora": "DOMINA",
"diasentrega": 3,
"stringdata": "numbererror=-0-|dataerror=|codigotransportadora=1026|transportadora=Domina|logotransportadora={ruta}|logotransportadora2={ruta}|origen=BOGOTA(CUNDINAMARCA)|destino=CALI(VALLE DEL CAUCA)|unidades=1|kilosacobrar=1|pesovolumen=0|valoracion=44950|porvaloracion=0.5|trayecto=Nacional|codtrayecto=96|tipoenvio=Mensajeria|fletexkilo=10820|fletexund=10820|fletetotal=10820|diasentrega=3|flete=10820|costomanejo=0|valortotal=10820|valorotros=1946|grantotal=12766|codmostrartransportadora=1026|topemaximo=0|dscontraentrega=0|alto=0|largo=0|ancho=0",
"bodegaId": "",
"bodegaTel": "",
"bodegaDir": "",
"bodegaEmail": "",
"bodega_usuario": "",
"bodega_id": "",
"bodegaOrigen": ""
}
],
}
],
}
Si esta pendiente de confirmar el pedido o no se genera guia de envio
{
"success": true,
"order_id": "0000000",
"messages": "Pedido 0000000 Agregado exitosamente. No se genera el envío. Lo puede hacer de manera posterior en la opción '<strong>Gestionar pedidos<\/strong> y\/o confirmando el proceso de pedido cuando el cliente asume el costo o se debe recaudar el valor.",
"valortransporte": 00000,
"id": 116056,
"diasEntrega": 3,
"operador": "DOMINA",
"bodegaContact": "",
"bodegaId": "",
"bodegaTel": "",
"bodegaDir": "",
"bodegaEmail": "",
"bodega_usuario": "",
"bodega_id": "",
"bodegaOrigen": "",
"databodegas": [
{
"bodega_id": "0000",
"bodega_nombre": "BODEGA PRUEBA",
"dataoperadores": [
{
"status": 1,
"message": "Datos recibidos",
"flete": 10820,
"variable": 0,
"comision": 1946,
"total": 12766,
"campo": 1026,
"transportadora": "DOMINA",
"stringdata": "numbererror=-0-|dataerror=|codigotransportadora=1026|transportadora=Domina|logotransportadora={ruta}|logotransportadora2={ruta}|origen=BOGOTA(CUNDINAMARCA)|destino=CALI(VALLE DEL CAUCA)|unidades=1|kilosacobrar=1|pesovolumen=0|valoracion=44950|porvaloracion=0.5|trayecto=Nacional|codtrayecto=96|tipoenvio=Mensajeria|fletexkilo=10820|fletexund=10820|fletetotal=10820|diasentrega=3|flete=10820|costomanejo=0|valortotal=10820|valorotros=1946|grantotal=12766|codmostrartransportadora=1026|topemaximo=0|dscontraentrega=0|alto=0|largo=0|ancho=0",
"bodegaContact": "",
"bodegaId": "",
"bodegaTel": "",
"bodegaDir": "",
"bodegaEmail": "",
"bodega_usuario": "",
"bodega_id": "",
"bodegaOrigen": "",
}
],
}
],
}
Errores de Validación
Método no permitido (405)
{
"status": "error",
"message": "Error de solicitud, el método no está permitido."
}
Producto no encontrado (400)
{
"success": false,
"order_id": "",
"messages": "El producto referencia REF-123 no se encuentra en el inventario"
}
Sin inventario disponible (400)
{
"success": false,
"order_id": "",
"messages": "El producto referencia REF-123 no posee unidades disponibles en el inventario."
}
Cantidad insuficiente en inventario (400)
{
"success": false,
"order_id": "",
"messages": "El total de las unidades solicitadas no están disponibles en los inventarios"
}
Bodega no válida (404)
{
"status": "error",
"message": "La bodega con código 12345 no pertenece a la empresa."
}
Pedido en proceso (409)
{
"status": "error",
"message": "Pedido en proceso de creación con el número de pedido externo: TEST-123"
}
Pedido duplicado (409)
{
"status": "error",
"message": "Ya existe un pedido con el número de pedido externo: TEST-123"
}
Múltiples proveedores en items (400)
{
"status": "error",
"message": "Los productos no pertenecen al mismo proveedor."
}
Múltiples bodegas en items (400)
{
"status": "error",
"message": "Los productos no pertenecen a la misma bodega."
}
Arrays de productos no coinciden (400)
{
"success": false,
"order_id": "",
"messages": "La cantidad de productos no coincide con las unidades especificadas."
}
Recaudo sin identificación (422)
{
"status": "error",
"message": "El número de identificación del cliente es requerido cuando hay recaudo."
}
Identificación inválida para recaudo (422)
{
"status": "error",
"message": "El número de identificación debe tener mínimo 5 dígitos."
}
Identificación iniciando en cero (422)
{
"status": "error",
"message": "El número de identificación no puede empezar con cero."
}
Error al registrar cliente (400)
{
"status": "error",
"message": "Error al registrar el cliente: [detalle del error]"
}
Error al crear pedido (400)
{
"success": false,
"messages": "Error al crear el pedido: [detalle del error SQL]"
}
Error al validar duplicados (400)
{
"status": "error",
"message": "Error en la validación de pedidos duplicados"
}
Error al registrar log (400)
{
"status": "error",
"message": "Error al registrar log del pedido"
}
Empresa inválida o ausente (400)
{
"status": "error",
"message": "El identificador de empresa es incorrecto o se ha producido un error inesperado."
}
Totales no válidos para crear pedido (422)
{
"status": "error",
"message": "No se puede generar el pedido porque no existe un valor total. Verifique la configuración de los pedidos."
}
Error después de creación (500)
{
"status": "error",
"message": "Error al crear la orden. Por favor, inténtelo nuevamente."
}
Notas Importantes 📝
- El campo
order_consecse genera automáticamente:{empresa}{random(4)}{timestamp} - Si
recaudo > 0, el campopagadose establece en 2 (no pagado) - Si
revisarCE = 1, no se genera guía hasta confirmar el pedido - El sistema soporta duplicación intencional pero lo registra en logs
- Las ciudades deben enviarse en formato 'CIUDAD(DEPARTAMENTO)' o código DANE
- El peso mínimo es 1 Kg (se ajusta automáticamente)
- El payload preferido es
items(array de objetos) y debe ser la primera opción en integraciones JSON - Los arrays paralelos se mantienen para formularios y compatibilidad legacy
pagadose interpreta en backend como entero: solo valor 1 se toma como pagado- En la versión actual del endpoint,
enviopropiono está afectando el flujo como se esperaría por una normalización interna - Se valida inventario en tiempo real antes de crear el pedido
- Las novedades se registran todas, pero el estado final es el de mayor prioridad
- Si la ciudad o dirección tiene problema, normalmente se registra como novedad en
order_statusen lugar de devolver error inmediato - La generación de guía es asíncrona para mejorar performance
- Se envía notificación WhatsApp automática si hay configuración de Línea Estándar
- El método HTTP debe ser POST, de lo contrario retorna error 405
- Todos los totales se redondean automáticamente
- Si hay múltiples novedades, se crean logs separados para cada una