Dos APIs REST de StandardCWMP, siempre en JSON con la forma { "ok": true|false, ... }: la API de gestión (para integrar tu software/CRM) y la API del cliente (la que usa la app móvil).
https://acs.standardcwmp.com/api/empresaAuthorization: Bearer sk_...Lista los planes de velocidad de tu empresa (para elegir uno al crear un cliente).
(sin cuerpo)
{
"ok": true,
"planes": [
{ "id": 1, "nombre": "<nombre del plan>", "bajada_mbps": 30, "subida_mbps": 8 }
]
}Crea un cliente (contrato) y DEVUELVE sus credenciales CWMP para configurar el router. El plan se indica por "plan_id" o por "plan" (nombre).
{
"codigo_contrato": "<número de contrato>",
"primer_nombre": "<primer nombre>",
"primer_apellido": "<primer apellido>",
"documento": "<documento NIT/CC>",
"celular": "<celular>",
"codigo_pais": "57",
"plan": "<nombre del plan>"
}{
"ok": true,
"cliente": { "codigo_contrato": "<número de contrato>", "plan": "<nombre del plan>", "activo": true },
"cwmp": {
"acs_url": "https://acs.standardcwmp.com/acs",
"usuario": "<usuario CWMP>",
"clave": "<contraseña CWMP>"
}
}Lista todos tus clientes con sus credenciales CWMP.
(sin cuerpo)
{
"ok": true,
"clientes": [ { "codigo_contrato": "<número de contrato>", "cwmp": { "usuario": "<usuario CWMP>", "clave": "<contraseña CWMP>" } } ]
}Obtiene un cliente por su código de contrato, con sus credenciales CWMP.
(sin cuerpo)
{
"ok": true,
"cliente": { "codigo_contrato": "<número de contrato>", "cwmp": { "acs_url": "...", "usuario": "<usuario CWMP>", "clave": "<contraseña CWMP>" } }
}Regenera las credenciales CWMP de un cliente (invalida las anteriores).
(sin cuerpo)
{
"ok": true,
"cwmp": { "acs_url": "...", "usuario": "<usuario CWMP>", "clave": "<contraseña CWMP>" }
}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.
(sin cuerpo)
{
"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.
(sin cuerpo)
{
"ok": true,
"panel": { /* ... */ }
}
Revoca el token de sesión actual (cerrar sesión).
(sin cuerpo)
{
"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." }