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.
https://api.sandbox.sumimega.com/publica/v1-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
| Campo | Valor | Qué significa |
|---|---|---|
confirmacion.estado | pendiente | SumiMega aún no confirma el pedido. |
confirmacion.estado | confirmado | Ya lo confirmamos y pasó a preparación. Es la señal que debes mirar. |
confirmacion.documento | texto o null | Nuestro número interno del pedido. Cítalo al hablar con tu asesor. |
estado | recibido | Estado inicial del pedido. |
estado | en_proceso, listo_para_despacho, enviado | Avance del pedido, cuando nuestro equipo lo actualiza. |
estado | completado | Pedido finalizado. |
estado | cancelado | El pedido no continúa. Si no lo esperabas, escribe a tu asesor. |
pago.estado | en_revision | Lo revisa nuestro equipo. Es el estado normal de un pedido a crédito. |
pago.estado | pendiente, aprobado, rechazado | Resultado de la revisión del pago. |
inventario.reservado_hasta | fecha o null | Hasta 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_ende la última fila: tu próxima consulta empieza desde ahí. - Descarta los repetidos comparando
numeroyactualizado_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 504 | Igual, respetando la cabecera Retry-After si viene. |
201 | Listo. Guarda numero y referencia. |
409 stock_insuficiente, 409 precio_cambio o 422 pedido_invalido | No se creó nada. Corrige y reenvía; puedes usar la misma clave. |
422 idempotency_key_reutilizada o 409 idempotency_key_expirada | Esa 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_envioen 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 |
|---|---|
| Consultas | 120 por minuto, por empresa |
| Simulaciones | 30 por minuto, por empresa |
| Pedidos nuevos | 10 por minuto y 200 por día, por empresa |
| Pedidos a la vez | 1 por empresa: envíalos de uno en uno |
| Pedidos pendientes de confirmar | hasta 50 por empresa |
| Valor pendiente de confirmar | hasta $30.000.000 COP con IVA, por empresa |
| Valor por pedido | hasta $30.000.000 COP con IVA |
| Líneas por pedido | 250 |
| Cantidad por línea | 5.000 unidades |
| Tamaño de la petición | 64 KB |
| Reserva de inventario | 3 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"
]
}
]
}
}
| HTTP | code | Qué significa | Qué hacer |
|---|---|---|---|
| 400 | credencial_en_idempotency_key | La 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. |
| 400 | credencial_en_url | Nunca envíes la clave en la URL: usa la cabecera Authorization y revoca esta clave. | Revocar la clave expuesta y crear otra. |
| 400 | cursor_invalido | El cursor de paginación no es válido. | Repetir la consulta sin cursor. |
| 400 | idempotency_key_invalida | La Idempotency-Key debe tener de 8 a 128 caracteres: letras, números, punto, guion, dos puntos o guion bajo. | Usar un UUID v4. |
| 400 | idempotency_key_requerida | Falta 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. |
| 400 | json_invalido | El cuerpo no es JSON válido (NaN e Infinity no se admiten). | Corregir el cuerpo. |
| 400 | parametro_invalido | Un parámetro de la consulta no es válido. | Revisar el parámetro indicado. |
| 401 | credencial_de_otro_entorno | Esta 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. |
| 401 | credencial_invalida | La clave no es válida. | Revisar el secreto configurado en el sistema que llama. |
| 401 | credencial_requerida | Falta la clave. Envía la cabecera «Authorization: Bearer <clave>». | Configurar la cabecera Authorization. |
| 401 | credencial_revocada | La clave fue revocada. Crea otra en el espacio Desarrollador. | Crear una clave nueva y cambiarla en tu sistema. |
| 401 | credencial_vencida | La clave venció. Crea otra en el espacio Desarrollador. | Crear una clave nueva y cambiarla en tu sistema. |
| 403 | alcance_insuficiente | La clave no tiene permiso para esta operación. | Crear una clave con el permiso indicado. |
| 403 | cuenta_inhabilitada | La cuenta dueña de esta clave ya no puede usar la API. Comunícate con tu asesor de SumiMega. | Contactar a SumiMega. |
| 403 | empresa_no_habilitada | El acceso por API de esta empresa no está habilitado. | Solicitar la habilitación en el espacio Desarrollador. |
| 403 | ip_no_autorizada | Esta 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. |
| 404 | pedido_no_encontrado | No encontramos ese pedido en tu empresa. | Revisar el número o la referencia WEB-n. |
| 404 | ruta_no_encontrada | Esa ruta no existe en la API v1. Revisa la documentación. | Revisar la ruta (sin barra final). |
| 405 | metodo_no_permitido | Ese método no está permitido en esta ruta. | Revisar el método HTTP. |
| 408 | cuerpo_incompleto | El cuerpo de la petición no llegó completo a tiempo. | Reintentar. |
| 409 | demasiados_pedidos_pendientes | Tienes demasiados pedidos por API pendientes de revisión. | Esperar a que SumiMega confirme los pendientes o escribir a tu asesor. |
| 409 | idempotency_key_expirada | Esta Idempotency-Key ya creó un pedido. Usa una nueva para un pedido nuevo. | Consultar el pedido indicado; usar otra clave para un pedido distinto. |
| 409 | precio_cambio | Los precios cambiaron desde tu simulación. No se creó el pedido. | Volver a simular y confirmar el nuevo total. |
| 409 | stock_insuficiente | No hay inventario suficiente. No se creó el pedido. | Ajustar las cantidades según «faltantes»; la misma Idempotency-Key sigue sirviendo. |
| 409 | valor_pendiente_excedido | Con 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. |
| 413 | cuerpo_demasiado_grande | La petición supera el tamaño máximo permitido. | Partir el pedido en varios. |
| 415 | tipo_contenido_no_soportado | Envía el cuerpo como application/json, sin compresión. | Corregir Content-Type. |
| 422 | datos_invalidos | Revisa los datos enviados. | Corregir los campos de «errores». |
| 422 | idempotency_key_reutilizada | Esta 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. |
| 422 | pedido_invalido | El pedido tiene problemas y no se creó. | Corregir según «errores» y reintentar; la Idempotency-Key sigue libre. |
| 429 | cuota_de_pedidos | Alcanzaste el máximo de pedidos permitido por ahora. | Esperar lo que indica Retry-After. |
| 429 | demasiados_intentos | Demasiados intentos fallidos desde tu dirección. | Revisar la clave y esperar. |
| 429 | limite_de_peticiones | Demasiadas solicitudes. Espera un momento. | Esperar lo que indica Retry-After. |
| 429 | pedido_en_curso | Ya 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. |
| 503 | api_deshabilitada | La API de pedidos no está disponible en este momento. | Reintentar más tarde. |
| 503 | servicio_no_disponible | El servicio no está disponible. Reintenta en unos segundos. | Reintentar respetando Retry-After. |
| 503 | servicio_ocupado | El 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:
| code | Qué significa |
|---|---|
producto_no_disponible | El producto no existe o no está disponible para la venta. |
linea_duplicada | El mismo producto aparece en más de una línea: súmalas en una. |
productos_fuera_de_lista | Hay productos fuera de las listas de compra autorizadas. |
metodo_pago_no_permitido | Ese método de pago no está disponible para tu empresa. |
compra_minima_no_alcanzada | El pedido no alcanza el monto mínimo de compra. |
monto_maximo_excedido | El pedido supera el monto máximo por pedido de la API. |
punto_envio_requerido | Tu empresa tiene varias sedes: indica a cuál va el pedido. |
punto_envio_invalido | Ese punto de envío no es de tu empresa. |
punto_envio_inactivo | Ese punto de envío está inactivo. |
empresa_datos_incompletos | Faltan datos de facturación de la empresa. |
stock_insuficiente | No 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.