La integración de StandardCWMP es de una sola vía (PULL): StandardCWMP lee los datos de tu software (StandardERP o ArionColombia) para mantener su base al día — nunca escribe en él. Abajo está el contrato que tu software debe exponer y, aparte, la API interna de la app móvil.
GET a TU software. Jamás envía ni modifica datos.Authorization: Bearer <token>planes → nodos → clientes, para que un cliente pueda referenciar su plan y su nodo por nombre. planes y nodos son opcionales (404 = se gestionan a mano).Este mismo contrato está disponible como PDF descargable desde la Cuenta Maestra → Configuración, para entregárselo a tu proveedor.
Verificación de conexión. StandardCWMP la usa en el botón "Probar conexión".
?pagina) y en la cabecera Authorization.{
"ok": true,
"software": "StandardERP",
"version": "x.y.z"
}OPCIONAL. Planes de velocidad. StandardCWMP los crea/actualiza por nombre (con sus Mbps de bajada/subida) para poder asignarlos a los clientes. Si no implementas este endpoint (404), los planes se gestionan a mano.
?pagina) y en la cabecera Authorization.{
"pagina": 1,
"total_paginas": 1,
"planes": [
{ "nombre": "Basic", "bajada_mbps": 10, "subida_mbps": 3 }
]
}OPCIONAL. Nodos/torres. Se crean/actualizan por nombre. Puedes enviarlos SIN coordenadas al principio y agregarles latitud/longitud después: StandardCWMP actualizará su ubicación en la siguiente sincronización (nunca borra coordenadas ya cargadas). 404 = se gestionan a mano.
?pagina) y en la cabecera Authorization.{
"pagina": 1,
"total_paginas": 1,
"nodos": [
{ "nombre": "Troncal Ariel", "latitud": 6.3801, "longitud": -75.447 },
{ "nombre": "Nodo Sin GPS" }
]
}Padrón de clientes: una fila por contrato/suscripción vigente (incluidos suspendidos; ver "estado"). StandardCWMP crea los nuevos y actualiza los existentes; el celular es donde llega el OTP de la app.
?pagina) y en la cabecera Authorization.{
"fecha_corte": "2026-08-21 10:05:00",
"pagina": 1,
"total_paginas": 1,
"clientes": [
{
"contrato": "C-1024",
"documento": "1017234567",
"primer_nombre": "MARIA",
"primer_apellido": "PEREZ",
"celular": "3001234567",
"plan_nombre": "Basic",
"nodo": "Troncal Ariel",
"latitud": 6.3801, "longitud": -75.447,
"estado": "activo"
}
]
}OPCIONAL (fase 2): estado de pago por cliente para mostrar cartera al día / en mora.
?pagina) y en la cabecera Authorization.{
"fecha_corte": "...",
"clientes": [
{ "documento": "1017234567", "estado_cartera": "al_dia", "saldo_pendiente": 0 }
]
}La que usa la app del suscriptor. Normalmente no la necesitas para integrar tu software.
https://acs.standardcwmp.com/api/cliente/verificar)Los endpoints protegidos requieren la cabecera:
Authorization: Bearer <token>
Flujo: identificar → (OTP por SMS) → verificar devuelve el token. Guárdalo y envíalo en cada petición protegida.
Valida el número de contrato + documento y envía un código OTP por SMS al celular del titular. Devuelve una referencia "pendiente" para el siguiente paso.
{
"codigo_contrato": "<número de contrato>",
"documento": "<documento NIT/CC>"
} {
"ok": true,
"pendiente": "<referencia temporal>",
"telefono": "+57 ******XXXX",
"vigencia": 5
}
Verifica el código OTP. Si es correcto, emite el token de sesión (Bearer) y devuelve el panel inicial.
{
"pendiente": "<referencia temporal>",
"codigo": "<código OTP de 6 dígitos>"
} {
"ok": true,
"token": "<token de sesión>",
"panel": { /* ver objeto panel */ }
}
Reenvía un nuevo código OTP usando la referencia "pendiente".
{
"pendiente": "<referencia temporal>"
} {
"ok": true
}
Devuelve el panel completo del cliente: contrato, router, consumo 24h y dispositivos conectados.
{
"ok": true,
"panel": { /* ver objeto panel */ }
}
Cambia el nombre de red (SSID) y/o la contraseña del WiFi del cliente. Puedes enviar uno o ambos.
{
"ssid": "Mi-WiFi",
"clave": "nueva-clave-8+"
} {
"ok": true,
"mensaje": "Cambios aplicándose...",
"panel": { /* ... */ }
}
Pide al router una actualización de datos (SSID y dispositivos) y despierta el equipo.
{
"ok": true,
"panel": { /* ... */ }
}
Revoca el token de sesión actual (cerrar sesión).
{
"ok": true
}
panel{
"contrato": {
"codigo": "",
"titular": "",
"primer_nombre": "",
"documento": "",
"plan_nombre": "",
"plan_bajada": 30, "plan_subida": 8,
"fecha_contrato": "DD/MM/AAAA"
},
"empresa": { "nombre": "", "logo_url": "https://.../logo.png" },
"router": {
"conectado": true, "fabricante": "", "en_linea": true,
"sync_iso": "2026-01-01T15:24:00+00:00",
"ssid": "", "clave_wifi": "********"
},
"consumo": {
"labels": ["2026-01-01T10:59:00+00:00", "..."],
"descarga": [0.0, 0.47], "subida": [0.18, 0.71],
"totalDescargaGb": 0.47, "totalSubidaGb": 0.71, "totalGb": 1.18
},
"hosts": [ { "nombre": "", "ip": "192.168.0.x", "mac": "XX:XX:XX:XX:XX:XX", "tipo": "DHCP" } ]
}
Los errores devuelven ok: false con un mensaje legible y el código HTTP correspondiente:
{ "ok": false, "mensaje": "El código expiró. Solicita uno nuevo." }