SumiMega

Guía de la API de pedidos

Conecta el sistema de tu empresa con SumiMega para consultar tus precios, ver la disponibilidad y enviarnos pedidos sin entrar a la tienda.

Referencia técnica Colección de Postman Skill para agentes de IA

Estás en el entorno de pruebas. Los pedidos que crees aquí no son reales: no se preparan, no se facturan y no se envía ningún correo. Tiene el mismo contrato, las mismas reglas y una copia reciente de los datos de tu empresa. Usa claves smg_test_. Cuando todo funcione, cambia la dirección base a https://api.sumimega.com/publica/v1 y usa una clave smg_live_: nada más cambia.

Qué puedes hacer

  • Ver el catálogo con los precios de tu empresa y el inventario disponible.
  • Validar un pedido completo sin crearlo.
  • Crear pedidos a cualquiera de tus sedes, desde tu ERP, una hoja de cálculo o un agente de IA.
  • Consultar el estado de tus pedidos.

Cada pedido que nos envías entra a SumiMega igual que uno hecho en sumimega.com: lo revisa nuestro equipo y lo ves también en tu panel.

Dirección basehttps://api.sandbox.sumimega.com/publica/v1
FormatoJSON en UTF-8
DineroPesos colombianos (COP). Los precios y totales incluyen IVA.
FechasISO 8601, hora de Colombia (-05:00)

Antes de empezar

1. Pide la habilitación

Inicia sesión en sumimega.com con la cuenta principal de tu empresa y entra a Mi Panel → Desarrollador (con tu empresa seleccionada). Pulsa Solicitar habilitación. Verificamos tu NIT y te avisamos por correo.

2. Crea una clave

En ese mismo espacio crea una clave (empieza por smg_test_). Te pedimos tu contraseña y solo te la mostramos una vez: guárdala en el gestor de secretos de tu sistema. Crea una por cada sistema que se conecte; así puedes revocar una sin afectar a las demás.

3. Compruébala

Envía la clave en la cabecera Authorization de todas las peticiones:

export SUMIMEGA_API_KEY=smg_test_...

curl https://api.sandbox.sumimega.com/publica/v1/cuenta \
  -H "Authorization: Bearer $SUMIMEGA_API_KEY"

Si la respuesta trae "lista_para_pedidos": true, ya puedes enviar pedidos. Si es false, el campo avisos dice qué falta.

4. (Opcional) Autoriza tus IP

Para mayor seguridad, en Desarrollador puedes indicar las IP públicas de tus servidores: desde ese momento solo aceptamos peticiones que salgan de ellas. GET /cuenta te dice en ip_vista con qué IP te vemos.

Tu primer pedido

Entorno de pruebas. Cada POST /pedidos crea un pedido de prueba, que aparta inventario aquí y no es real. POST /pedidos/simular hace las mismas validaciones sin crear nada.

Paso 1. Elige la sede

curl https://api.sandbox.sumimega.com/publica/v1/puntos-envio \
  -H "Authorization: Bearer $SUMIMEGA_API_KEY"
{
  "datos": [
    {
      "codigo": "000",
      "nombre": "Sede principal",
      "direccion": "CR 50 # 10-20",
      "activo": true
    },
    {
      "codigo": "01",
      "nombre": "Bodega Itagüí",
      "direccion": "CR 50 # 79 SUR-101",
      "activo": true
    },
    {
      "codigo": "07",
      "nombre": "Almacén Centro",
      "direccion": "CL 44 # 52-31",
      "activo": true
    }
  ],
  "obligatorio": true,
  "codigo_por_defecto": null
}

Usa el codigo tal cual, como texto. Si obligatorio es true, tu empresa tiene varias sedes y debes indicar una en cada pedido.

Paso 2. Busca los productos

curl "https://api.sandbox.sumimega.com/publica/v1/productos?q=resma&con_stock=true" \
  -H "Authorization: Bearer $SUMIMEGA_API_KEY"

curl "https://api.sandbox.sumimega.com/publica/v1/productos?sku=1100123&sku=1200456" \
  -H "Authorization: Bearer $SUMIMEGA_API_KEY"
{
  "datos": [
    {
      "producto_id": 20870,
      "sku": "1100123",
      "nombre": "Resma Papel Carta 75Gr",
      "marca": "REPROGRAF",
      "categoria_id": 118,
      "unidad": "UND",
      "imagen": "https://api.sumimega.com/api/v1/storage/product-images/public/1100123.jpg",
      "precio_unitario": 23800.0,
      "precio_unitario_sin_iva": 20000.0,
      "iva_porcentaje": 19.0,
      "precio_acordado": false,
      "disponible": 320,
      "actualizado_en": "2026-11-03T08:10:00-05:00"
    }
  ],
  "siguiente_cursor": null
}

precio_unitario incluye IVA y es el de tu empresa. disponible es lo que hay libre en este momento. Para traer el catálogo completo, repite la consulta con cursor=<siguiente_cursor> hasta que siguiente_cursor sea null.

Paso 3. Simula el pedido

curl -X POST https://api.sandbox.sumimega.com/publica/v1/pedidos/simular \
  -H "Authorization: Bearer $SUMIMEGA_API_KEY" \
  -H "Content-Type: application/json" \
  -d @pedido.json

Donde pedido.json es:

{
  "punto_envio": "07",
  "metodo_pago": "credito",
  "orden_compra": "OC-2026-0091",
  "notas": "Recibe Juan Pérez, bodega 3. Horario 7:00-15:00.",
  "lineas": [
    {
      "sku": "1100123",
      "cantidad": 40
    },
    {
      "producto_id": 20871,
      "cantidad": 12
    }
  ]
}

Cada línea lleva sku o producto_id (uno de los dos) y cantidad (entero). Los precios no se envían: los calculamos nosotros. La simulación siempre responde 200; míralo en valido y problemas:

{
  "valido": true,
  "problemas": [],
  "pedido": {
    "lineas": [
      {
        "producto_id": 20870,
        "sku": "1100123",
        "nombre": "Resma Papel Carta 75Gr",
        "cantidad": 40,
        "precio_unitario": 23800.0,
        "total": 952000.0
      },
      {
        "producto_id": 20871,
        "sku": "1200456",
        "nombre": "Guantes Nitrilo Talla M X100",
        "cantidad": 12,
        "precio_unitario": 11900.0,
        "total": 142800.0
      }
    ],
    "totales": {
      "subtotal": 920000.0,
      "iva": 174800.0,
      "descuento": 0,
      "total": 1094800.0,
      "moneda": "COP"
    },
    "punto_envio": {
      "codigo": "07",
      "nombre": "Almacén Centro",
      "direccion": "CL 44 # 52-31"
    },
    "metodo_pago": "credito",
    "compra_minima": {
      "monto": 150000,
      "incluye_iva": false,
      "aplica": true,
      "cumple": true
    }
  },
  "avisos": [
    {
      "code": "precios_vigentes",
      "message": "Los precios se recalculan al crear el pedido; envía total_esperado para blindarlo."
    }
  ]
}

Paso 4. Crea el pedido

Envía el mismo cuerpo más total_esperado (el total de la simulación). Si el precio cambió entre tanto, no creamos nada y te respondemos 409 precio_cambio: así nunca compras a un precio que no viste. Genera una Idempotency-Key nueva para este pedido y guárdala antes de enviar (más abajo te explicamos por qué).

CLAVE=$(uuidgen)

curl -i -X POST https://api.sandbox.sumimega.com/publica/v1/pedidos \
  -H "Authorization: Bearer $SUMIMEGA_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $CLAVE" \
  -d @pedido.json

Con total_esperado, pedido.json queda así:

{
  "punto_envio": "07",
  "metodo_pago": "credito",
  "orden_compra": "OC-2026-0091",
  "notas": "Recibe Juan Pérez, bodega 3. Horario 7:00-15:00.",
  "total_esperado": 1094800.0,
  "lineas": [
    {
      "sku": "1100123",
      "cantidad": 40
    },
    {
      "producto_id": 20871,
      "cantidad": 12
    }
  ]
}

Respuesta 201, con el número y la referencia que debes guardar:

{
  "pedido": {
    "numero": 4123,
    "referencia": "WEB-4123",
    "origen": "api",
    "estado": "recibido",
    "pago": {
      "metodo": "credito",
      "estado": "en_revision"
    },
    "creado_en": "2026-11-03T09:42:11-05:00",
    "actualizado_en": "2026-11-03T09:42:11-05:00",
    "empresa": {
      "id": "3f1c9a52-7d0e-4c1b-9a35-2b8e6d4f1a70",
      "nombre": "Comercial Andina SAS",
      "nit": "900123456"
    },
    "punto_envio": {
      "codigo": "07",
      "nombre": "Almacén Centro",
      "direccion": "CL 44 # 52-31"
    },
    "orden_compra": "OC-2026-0091",
    "clave_idempotencia": "7b0c1f0e-52c5-4a59-9c1d-5f3f1a7e2d10",
    "notas": "Recibe Juan Pérez, bodega 3. Horario 7:00-15:00.",
    "lineas": [
      {
        "producto_id": 20870,
        "sku": "1100123",
        "nombre": "Resma Papel Carta 75Gr",
        "cantidad": 40,
        "precio_unitario": 23800.0,
        "total": 952000.0
      },
      {
        "producto_id": 20871,
        "sku": "1200456",
        "nombre": "Guantes Nitrilo Talla M X100",
        "cantidad": 12,
        "precio_unitario": 11900.0,
        "total": 142800.0
      }
    ],
    "totales": {
      "subtotal": 920000.0,
      "iva": 174800.0,
      "descuento": 0,
      "total": 1094800.0,
      "moneda": "COP"
    },
    "inventario": {
      "reservado": true,
      "reservado_hasta": "2026-11-06T09:42:11-05:00"
    },
    "confirmacion": {
      "estado": "pendiente",
      "documento": null
    }
  },
  "avisos": [
    {
      "code": "reserva_temporal",
      "message": "El inventario queda apartado mientras SumiMega revisa el pedido. Si no se confirma en 3 días, se libera y el pedido sigue vigente."
    },
    {
      "code": "redondeo_factura",
      "message": "La factura se liquida con el precio neto redondeado a pesos: puede diferir unos pesos del total."
    }
  ]
}

En el entorno de pruebas no enviamos correos.

Después de crearlo

El pedido entra a revisión de nuestro equipo y el inventario queda apartado. Consúltalo por su número o referencia:

curl https://api.sandbox.sumimega.com/publica/v1/pedidos/WEB-4123 \
  -H "Authorization: Bearer $SUMIMEGA_API_KEY"

Cómo leer el pedido

CampoValorQué significa
confirmacion.estadopendienteSumiMega aún no confirma el pedido.
confirmacion.estadoconfirmadoYa lo confirmamos y pasó a preparación. Es la señal que debes mirar.
confirmacion.documentotexto o nullNuestro número interno del pedido. Cítalo al hablar con tu asesor.
estadorecibidoEstado inicial del pedido.
estadoen_proceso, listo_para_despacho, enviadoAvance del pedido, cuando nuestro equipo lo actualiza.
estadocompletadoPedido finalizado.
estadocanceladoEl pedido no continúa. Si no lo esperabas, escribe a tu asesor.
pago.estadoen_revisionLo revisa nuestro equipo. Es el estado normal de un pedido a crédito.
pago.estadopendiente, aprobado, rechazadoResultado de la revisión del pago.
inventario.reservado_hastafecha o nullHasta cuándo apartamos el inventario si el pedido no se ha confirmado (3 días). Después se libera, pero el pedido sigue vigente.

estado no siempre avanza paso a paso: lo actualiza nuestro equipo. Para saber si ya tomamos tu pedido, mira confirmacion.estado. Las facturas y la cartera están en Mi Panel → Cartera y Pedidos.

Enterarte de los cambios

Consulta cada cierto tiempo los pedidos que cambiaron (recomendado: cada 5 a 15 minutos):

curl "https://api.sandbox.sumimega.com/publica/v1/pedidos?actualizado_desde=2026-11-03T00:00:00-05:00" \
  -H "Authorization: Bearer $SUMIMEGA_API_KEY"
  • Llegan del más antiguo al más reciente. Si trae siguiente_cursor, pide la siguiente página con &cursor=....
  • Guarda el actualizado_en de la última fila: tu próxima consulta empieza desde ahí.
  • Descarta los repetidos comparando numero y actualizado_en.
  • Solo salen cambios de hace más de 2 minutos. Para ver un pedido al instante usa GET /pedidos/{referencia}.

GET /pedidos también filtra por desde, hasta, estado, origen (api, web o todos) y orden_compra. Incluye los pedidos que hiciste en la tienda.

Reintentar sin duplicar

Si la conexión se corta justo después de enviar, no sabes si el pedido se creó. La Idempotency-Key resuelve eso: es un identificador que tú generas (un UUID v4) una vez por pedido. Si repites la petición con la misma clave y el mismo cuerpo, nunca se crea un segundo pedido: te devolvemos el original con la cabecera Idempotent-Replayed: true.

Si recibes…Haz esto
Nada (se cortó la conexión, venció el plazo)Reintenta con la misma clave y el mismo cuerpo.
429, 500, 502, 503 o 504Igual, respetando la cabecera Retry-After si viene.
201Listo. Guarda numero y referencia.
409 stock_insuficiente, 409 precio_cambio o 422 pedido_invalidoNo se creó nada. Corrige y reenvía; puedes usar la misma clave.
422 idempotency_key_reutilizada o 409 idempotency_key_expiradaEsa clave ya creó un pedido (viene en la respuesta). Consúltalo y no crees otro sin revisar.

¿No estás seguro de si llegó? Pregúntalo por la clave; funciona en cualquier momento:

curl "https://api.sandbox.sumimega.com/publica/v1/pedidos?clave_idempotencia=$CLAVE" \
  -H "Authorization: Bearer $SUMIMEGA_API_KEY"

Usa una clave nueva solo para un pedido distinto. La clave admite de 8 a 128 caracteres (letras, números, punto, guion, guion bajo y dos puntos) y es por empresa: si cambias tu clave de API, tus reintentos siguen funcionando.

Sedes

Cada sede tiene un código de texto: "07" y "7" son sedes distintas, así que no quites ni agregues ceros. Si envías el código como número, te lo rechazamos.

  • Varias sedes: indica punto_envio en cada pedido.
  • Una sola sede: puedes omitirlo; te la asignamos y te avisamos en avisos.
  • ¿Falta una sede o cambió su dirección? Pídeselo a tu asesor de SumiMega.

Límites

QuéLímite
Consultas120 por minuto, por empresa
Simulaciones30 por minuto, por empresa
Pedidos nuevos10 por minuto y 200 por día, por empresa
Pedidos a la vez1 por empresa: envíalos de uno en uno
Pedidos pendientes de confirmarhasta 50 por empresa
Valor pendiente de confirmarhasta $30.000.000 COP con IVA, por empresa
Valor por pedidohasta $30.000.000 COP con IVA
Líneas por pedido250
Cantidad por línea5.000 unidades
Tamaño de la petición64 KB
Reserva de inventario3 días mientras SumiMega confirma el pedido

Cada respuesta trae las cabeceras RateLimit-Remaining y RateLimit-Reset. Si superas un límite recibes 429 con Retry-After (segundos a esperar). GET /cuenta te da las cifras vigentes de tu empresa. Si tu operación necesita topes más altos, habla con tu asesor.

Cuida tu clave

  • Quien tenga tu clave puede crear pedidos a nombre de tu empresa. Guárdala como una contraseña.
  • Nunca la pongas en una URL (la rechazamos), en el código de una página web, en un correo ni en un chat.
  • Las claves vencen (te avisamos por correo a los 14 y a los 3 días). Crea la nueva, cámbiala en tu sistema y revoca la anterior.

Si crees que se expuso, revócala ya desde Desarrollador o desde tu propio sistema, y crea otra:

curl -X POST https://api.sandbox.sumimega.com/publica/v1/credencial/revocar \
  -H "Authorization: Bearer $SUMIMEGA_API_KEY"

Errores

Todos los errores tienen la misma forma. Tu sistema debe decidir con code (no cambia), no con message (puede mejorar con el tiempo). Si nos escribes por un error, cita el request_id.

{
  "detail": {
    "code": "pedido_invalido",
    "message": "El pedido tiene 1 problema(s). No se creó.",
    "request_id": "req_6f1d0c2a9b8e4c17a3d5e0f1",
    "errores": [
      {
        "code": "punto_envio_requerido",
        "message": "Tu empresa tiene varias sedes: indica a cuál va el pedido en «punto_envio».",
        "campo": "punto_envio",
        "puntos_validos": [
          "000",
          "01",
          "07"
        ]
      }
    ]
  }
}
HTTPcodeQué significaQué hacer
400credencial_en_idempotency_keyLa Idempotency-Key no puede llevar tu clave de API: genera un UUID por pedido y revoca esta clave.Revocar la clave expuesta y crear otra.
400credencial_en_urlNunca envíes la clave en la URL: usa la cabecera Authorization y revoca esta clave.Revocar la clave expuesta y crear otra.
400cursor_invalidoEl cursor de paginación no es válido.Repetir la consulta sin cursor.
400idempotency_key_invalidaLa Idempotency-Key debe tener de 8 a 128 caracteres: letras, números, punto, guion, dos puntos o guion bajo.Usar un UUID v4.
400idempotency_key_requeridaFalta la cabecera Idempotency-Key. Genera un UUID por pedido y reutilízalo en los reintentos.Generar una clave nueva por pedido y guardarla antes de enviar.
400json_invalidoEl cuerpo no es JSON válido (NaN e Infinity no se admiten).Corregir el cuerpo.
400parametro_invalidoUn parámetro de la consulta no es válido.Revisar el parámetro indicado.
401credencial_de_otro_entornoEsta clave es de otro entorno: las smg_live_ son de producción y las smg_test_, del entorno de pruebas. Revisa la dirección base.Usar la clave del entorno al que apunta la dirección base.
401credencial_invalidaLa clave no es válida.Revisar el secreto configurado en el sistema que llama.
401credencial_requeridaFalta la clave. Envía la cabecera «Authorization: Bearer <clave>».Configurar la cabecera Authorization.
401credencial_revocadaLa clave fue revocada. Crea otra en el espacio Desarrollador.Crear una clave nueva y cambiarla en tu sistema.
401credencial_vencidaLa clave venció. Crea otra en el espacio Desarrollador.Crear una clave nueva y cambiarla en tu sistema.
403alcance_insuficienteLa clave no tiene permiso para esta operación.Crear una clave con el permiso indicado.
403cuenta_inhabilitadaLa cuenta dueña de esta clave ya no puede usar la API. Comunícate con tu asesor de SumiMega.Contactar a SumiMega.
403empresa_no_habilitadaEl acceso por API de esta empresa no está habilitado.Solicitar la habilitación en el espacio Desarrollador.
403ip_no_autorizadaEsta credencial no está habilitada para la dirección de origen de la petición.Autorizar la IP pública del servidor en el espacio Desarrollador.
404pedido_no_encontradoNo encontramos ese pedido en tu empresa.Revisar el número o la referencia WEB-n.
404ruta_no_encontradaEsa ruta no existe en la API v1. Revisa la documentación.Revisar la ruta (sin barra final).
405metodo_no_permitidoEse método no está permitido en esta ruta.Revisar el método HTTP.
408cuerpo_incompletoEl cuerpo de la petición no llegó completo a tiempo.Reintentar.
409demasiados_pedidos_pendientesTienes demasiados pedidos por API pendientes de revisión.Esperar a que SumiMega confirme los pendientes o escribir a tu asesor.
409idempotency_key_expiradaEsta Idempotency-Key ya creó un pedido. Usa una nueva para un pedido nuevo.Consultar el pedido indicado; usar otra clave para un pedido distinto.
409precio_cambioLos precios cambiaron desde tu simulación. No se creó el pedido.Volver a simular y confirmar el nuevo total.
409stock_insuficienteNo hay inventario suficiente. No se creó el pedido.Ajustar las cantidades según «faltantes»; la misma Idempotency-Key sigue sirviendo.
409valor_pendiente_excedidoCon este pedido, tus pedidos por API pendientes de revisión pasarían el tope de valor de tu empresa. No se creó el pedido.Esperar a que SumiMega confirme los pendientes o pedir a tu asesor que revise el tope.
413cuerpo_demasiado_grandeLa petición supera el tamaño máximo permitido.Partir el pedido en varios.
415tipo_contenido_no_soportadoEnvía el cuerpo como application/json, sin compresión.Corregir Content-Type.
422datos_invalidosRevisa los datos enviados.Corregir los campos de «errores».
422idempotency_key_reutilizadaEsta Idempotency-Key ya creó el pedido indicado en «pedido», con un contenido distinto. No se creó otro.Si es el mismo pedido, consúltalo con GET /pedidos/{numero} y no lo reenvíes. Usa una clave nueva solo para un pedido distinto.
422pedido_invalidoEl pedido tiene problemas y no se creó.Corregir según «errores» y reintentar; la Idempotency-Key sigue libre.
429cuota_de_pedidosAlcanzaste el máximo de pedidos permitido por ahora.Esperar lo que indica Retry-After.
429demasiados_intentosDemasiados intentos fallidos desde tu dirección.Revisar la clave y esperar.
429limite_de_peticionesDemasiadas solicitudes. Espera un momento.Esperar lo que indica Retry-After.
429pedido_en_cursoYa hay otro pedido de tu empresa en curso. Reintenta en un momento con la misma Idempotency-Key.Enviar los pedidos de uno en uno y reintentar tras Retry-After con la misma Idempotency-Key.
503api_deshabilitadaLa API de pedidos no está disponible en este momento.Reintentar más tarde.
503servicio_no_disponibleEl servicio no está disponible. Reintenta en unos segundos.Reintentar respetando Retry-After.
503servicio_ocupadoEl servicio está ocupado. Reintenta en unos segundos con la misma Idempotency-Key.Reintentar respetando Retry-After.

Problemas de un pedido

Vienen en errores (al crear) y en problemas (al simular). Te los decimos todos a la vez, para que corrijas de una sola vez:

codeQué significa
producto_no_disponibleEl producto no existe o no está disponible para la venta.
linea_duplicadaEl mismo producto aparece en más de una línea: súmalas en una.
productos_fuera_de_listaHay productos fuera de las listas de compra autorizadas.
metodo_pago_no_permitidoEse método de pago no está disponible para tu empresa.
compra_minima_no_alcanzadaEl pedido no alcanza el monto mínimo de compra.
monto_maximo_excedidoEl pedido supera el monto máximo por pedido de la API.
punto_envio_requeridoTu empresa tiene varias sedes: indica a cuál va el pedido.
punto_envio_invalidoEse punto de envío no es de tu empresa.
punto_envio_inactivoEse punto de envío está inactivo.
empresa_datos_incompletosFaltan datos de facturación de la empresa.
stock_insuficienteNo hay inventario suficiente.

Preguntas frecuentes

¿Cómo cancelo o cambio un pedido?

La API no cancela ni edita pedidos. Escríbele a tu asesor de SumiMega cuanto antes, con el número del pedido.

¿Qué medios de pago puedo usar?

credito (si tu empresa no es de contado) y transferencia_bancaria. GET /cuenta te dice cuáles aplican a tu empresa. Si eliges transferencia, nuestro equipo te contacta con los datos de la cuenta.

¿Se pueden usar cupones?

No. Los cupones son solo para la tienda.

¿Cuál es el monto mínimo de compra?

El mismo de la tienda. GET /cuenta lo trae en compra_minima.

¿Por qué la factura difiere unos pesos del total?

La factura se liquida con el precio neto redondeado a pesos, así que puede diferir por unos pesos del total del pedido.

¿Las sucursales pueden tener su propia clave?

No. Las claves las administra la cuenta principal de la empresa. Los pedidos llegan a cada sucursal indicando su sede en punto_envio.

Tengo varias empresas en SumiMega. ¿Una clave sirve para todas?

No. Cada clave pertenece a una empresa: crea una por empresa.

¿Cada cuánto se actualizan precios e inventario?

El disponible y los precios cambian a lo largo del día. Por eso existe total_esperado, y la disponibilidad se confirma al crear el pedido. Si sincronizas el catálogo en tu sistema, hazlo completo una vez al día; para cambios puntuales usa actualizado_desde.

¿Cómo pido ayuda?

Escríbele a tu asesor de SumiMega con el número del pedido y el request_id de la respuesta (también viene en la cabecera X-Request-Id).

¿Qué pasa cuando cambia la API?

Podemos agregar campos nuevos en cualquier momento: tu sistema debe ignorar los que no conozca. Un cambio que rompa la compatibilidad saldría en /publica/v2, y mantendríamos esta versión al menos 6 meses.