StandardCWMP · API
← Volver

Documentación de la API

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.

🔌 Integración — tu software expone, StandardCWMP lee

DirecciónStandardCWMP hace peticiones GET a TU software. Jamás envía ni modifica datos.
AutenticaciónTu software emite un token; StandardCWMP lo envía en cada petición.
EncabezadoAuthorization: Bearer <token>
Se configura enEmpresa → Configuración → «Conexión con tu software».
Orden de lecturaStandardCWMP lee 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.

GET {url_base}/api/cwmp/ping 🔒 Bearer

Verificación de conexión. StandardCWMP la usa en el botón "Probar conexión".

Petición
Sin cuerpo — los parámetros van en la URL (?pagina) y en la cabecera Authorization.
Respuesta que debe devolver
{
  "ok": true,
  "software": "StandardERP",
  "version": "x.y.z"
}
GET {url_base}/api/cwmp/planes?pagina=1 🔒 Bearer

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.

Petición
Sin cuerpo — los parámetros van en la URL (?pagina) y en la cabecera Authorization.
Respuesta que debe devolver
{
  "pagina": 1,
  "total_paginas": 1,
  "planes": [
    { "nombre": "Basic", "bajada_mbps": 10, "subida_mbps": 3 }
  ]
}
GET {url_base}/api/cwmp/nodos?pagina=1 🔒 Bearer

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.

Petición
Sin cuerpo — los parámetros van en la URL (?pagina) y en la cabecera Authorization.
Respuesta que debe devolver
{
  "pagina": 1,
  "total_paginas": 1,
  "nodos": [
    { "nombre": "Troncal Ariel", "latitud": 6.3801, "longitud": -75.447 },
    { "nombre": "Nodo Sin GPS" }
  ]
}
GET {url_base}/api/cwmp/clientes?pagina=1 🔒 Bearer

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.

Petición
Sin cuerpo — los parámetros van en la URL (?pagina) y en la cabecera Authorization.
Respuesta que debe devolver
{
  "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"
    }
  ]
}
GET {url_base}/api/cwmp/cartera?pagina=1 🔒 Bearer

OPCIONAL (fase 2): estado de pago por cliente para mostrar cartera al día / en mora.

Petición
Sin cuerpo — los parámetros van en la URL (?pagina) y en la cabecera Authorization.
Respuesta que debe devolver
{
  "fecha_corte": "...",
  "clientes": [
    { "documento": "1017234567", "estado_cartera": "al_dia", "saldo_pendiente": 0 }
  ]
}

📱 API del cliente — app móvil

La que usa la app del suscriptor. Normalmente no la necesitas para integrar tu software.

Información general

Base URLhttps://acs.standardcwmp.com/api/cliente
FormatoJSON (Content-Type: application/json)
AutenticaciónToken Bearer (se obtiene en /verificar)
Vigencia token90 días

Autenticación

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.

Endpoints

POST /identificar Público

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.

Petición
{
  "codigo_contrato": "<número de contrato>",
  "documento": "<documento NIT/CC>"
}
Respuesta
{
  "ok": true,
  "pendiente": "<referencia temporal>",
  "telefono": "+57 ******XXXX",
  "vigencia": 5
}
POST /verificar Público

Verifica el código OTP. Si es correcto, emite el token de sesión (Bearer) y devuelve el panel inicial.

Petición
{
  "pendiente": "<referencia temporal>",
  "codigo": "<código OTP de 6 dígitos>"
}
Respuesta
{
  "ok": true,
  "token": "<token de sesión>",
  "panel": { /* ver objeto panel */ }
}
POST /reenviar Público

Reenvía un nuevo código OTP usando la referencia "pendiente".

Petición
{
  "pendiente": "<referencia temporal>"
}
Respuesta
{
  "ok": true
}
GET /panel 🔒 Requiere token

Devuelve el panel completo del cliente: contrato, router, consumo 24h y dispositivos conectados.

Petición
Sin cuerpo — no necesitas enviar body.
Respuesta
{
  "ok": true,
  "panel": { /* ver objeto panel */ }
}
POST /wifi 🔒 Requiere token

Cambia el nombre de red (SSID) y/o la contraseña del WiFi del cliente. Puedes enviar uno o ambos.

Petición
{
  "ssid": "Mi-WiFi",
  "clave": "nueva-clave-8+"
}
Respuesta
{
  "ok": true,
  "mensaje": "Cambios aplicándose...",
  "panel": { /* ... */ }
}
POST /refrescar 🔒 Requiere token

Pide al router una actualización de datos (SSID y dispositivos) y despierta el equipo.

Petición
Sin cuerpo — no necesitas enviar body.
Respuesta
{
  "ok": true,
  "panel": { /* ... */ }
}
POST /salir 🔒 Requiere token

Revoca el token de sesión actual (cerrar sesión).

Petición
Sin cuerpo — no necesitas enviar body.
Respuesta
{
  "ok": true
}

Objeto 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" } ]
}

Errores

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." }
401Sin token o token inválido/expirado
403Servicio del cliente inactivo
422Datos inválidos (contrato, documento u OTP)
429Demasiadas solicitudes (throttle)