API para desarrolladores

Integra tu CRM, tu bot o tu sistema con WIFICOR ISP: clientes, deuda, servicio y tickets, con llaves, permisos y registro de actividad.

WIFICOR ISP Developer API · versión v1 · dirección base de cada ISP https://tu-dominio.com/api/v1
Descargar OpenAPI

Primeros pasos

API para integrar tu sistema, CRM o bot con WIFICOR ISP: consulta clientes, deuda y servicio, y ejecuta acciones autorizadas.

  1. El dueño del ISP crea una llave en Ajustes generales > API e integraciones y marca los permisos que le da.
  2. Te entrega la llave (se muestra una sola vez) y el dominio de su sistema.
  3. Prueba la conexión: esta llamada te dice qué puede hacer tu llave.
curl \
  -H "Authorization: Bearer TU_LLAVE" \
  "https://TU-DOMINIO/api/v1/ping"

Después elige un módulo en el menú: cada uno trae sus endpoints con parámetros, respuestas y ejemplos.

Autenticación y permisos

Autenticación

Cada ISP crea sus llaves en *Ajustes generales > API e integraciones* y se las entrega a cada integración. Envíala en cada petición:

Authorization: Bearer <llave>

La llave se muestra una sola vez. Puede rotarse (la anterior sigue válida unas horas) y revocarse en cualquier momento. Esta API se usa por ISP: la dirección base es el dominio de cada ISP.

Permisos (scopes)

Cada llave lleva scopes. Lo que puede hacer es la intersección entre sus scopes y los permisos del perfil del usuario a cuyo nombre actúa.

ScopePermiteEstado
customers:readClientes: consultarDisponible
billing:readFacturas y deudaDisponible
payments:readMedios de pagoDisponible
payments:writePagos: promesas y comprobantesDisponible
service:readEstado del servicioDisponible
service:activateReactivar servicioDisponible
service:suspendCortar servicioDisponible
tickets:readTickets: consultarDisponible
tickets:writeTickets: crearDisponible
tickets:closeTickets: cerrarDisponible
network:readConsumo de redDisponible
onu:readONU y OLT: consultarDisponible
onu:writeONU: reiniciarDisponible

Límites y errores

Límites

Por defecto 120 peticiones por minuto por llave (el ISP puede fijar otro). Al pasarlo: 429 con Retry-After.

Idempotencia

Las escrituras (crear y cerrar ticket, promesa de pago, cortar y reactivar servicio, reiniciar ONU) aceptan Idempotency-Key: repetir la misma llave devuelve la respuesta original sin volver a ejecutar.

Errores

Siempre { "error": "CODIGO", "message": "..." }. Programa contra error, no contra message.

CódigoHTTPCuándo
UNAUTHORIZED401Falta la llave, no es válida, fue revocada o ya venció.
FORBIDDEN403El perfil del usuario de la llave no permite la operación, o el servicio está suspendido por licencia.
INSUFFICIENT_SCOPE403La llave no tiene el scope que exige este endpoint.
NOT_FOUND404El recurso no existe (o la ruta no existe).
INVALID_REQUEST400Faltan datos o tienen un formato inválido.
CONFLICT409La operación no se puede hacer en el estado actual.
RATE_LIMITED429Pasaste el límite de uso de la llave. Espera lo que indica Retry-After (segundos).
UNAVAILABLE500No se pudo completar. 503 si el conector no está disponible en este sistema. Se puede reintentar más tarde.

Convenciones

Multi-país

La moneda, la zona horaria y el país los fija cada empresa; GET /ping los devuelve. Los importes llevan su moneda (ISO 4217).

Compatibilidad

/api/v1 y /connector/v1 son la misma API. Los cambios dentro de v1 solo agregan campos y funciones; nada se quita ni cambia de significado sin una nueva versión.

Sistema

Estado de la API y de la llave que consulta.

La especificación de ESTE sistema, generada en el momento, con su dirección ya puesta. No necesita llave.

curl \
  "https://TU-DOMINIO/api/v1/openapi"

Comprueba la conexión y devuelve la región de la empresa (país, moneda, zona horaria) y solo las funciones que esta llave puede usar. Úsalo para probar la llave.

200 Correcto.
CampoTipoDescripción
okboolean
systemobject
system.namestring
system.versionstringVersión del sistema.
apiVersionstring
countrystring · puede ser nullPaís de la empresa (ISO 3166-1 alfa-2).
currencystringMoneda de la empresa (ISO 4217).
timezonestringZona horaria de la empresa.
languagestring
capabilitieslista de stringFunciones que ESTA llave puede usar (según sus scopes y el perfil del usuario).
scopeslista de stringScopes de la llave.
{
    "ok": true,
    "system": {
        "name": "Wificor ISP",
        "version": "8.0.1"
    },
    "apiVersion": "v1",
    "country": "PE",
    "currency": "PEN",
    "timezone": "America/Lima",
    "language": "es",
    "capabilities": [
        "customer.lookup",
        "customer.detail",
        "invoices"
    ],
    "scopes": [
        "customers:read",
        "billing:read"
    ]
}
  • 401 UNAUTHORIZED: falta la llave o no es válida.
  • 403 FORBIDDEN o INSUFFICIENT_SCOPE.
  • 429 RATE_LIMITED.
  • 500 UNAVAILABLE.
curl \
  -H "Authorization: Bearer TU_LLAVE" \
  "https://TU-DOMINIO/api/v1/ping"

Clientes

Buscar al cliente por su celular y ver su ficha.

Devuelve los clientes que tienen ese celular. Con más de uno el número es ambiguo: no adivines. numberBlocked indica si el número está en la lista de números a los que este sistema no atiende.

Permiso (scope) requerido: customers:read.

NombreEnTipoObligatorioDescripción
phonequerystringSíCelular con código de país, sin +, de 7 a 15 dígitos.
200 Correcto.
CampoTipoDescripción
matcheslista de objectClientes con ese celular. Si hay más de uno, el número es ambiguo: no adivines.
matches[].idstringId del cliente (numérico, como texto).
matches[].namestring
matches[].phoneslista de stringCelulares, solo dígitos y con código de país.
matches[].documentstringDocumento ENMASCARADO: nunca se entrega completo.
matches[].statusactive | suspended | pending | retiredEstado del servicio: activo, cortado, en instalación o dado de baja.
matches[].planstring · puede ser nullPlan contratado.
matches[].balanceobject
matches[].balance.amountnumberDeuda pendiente total.
matches[].balance.currencystringMoneda (ISO 4217).
matches[].balance.overdueInvoicesintegerCantidad de facturas vencidas.
matches[].nextDueDatestring · puede ser nullPróximo vencimiento pendiente (AAAA-MM-DD).
matches[].zonestring · puede ser null
numberBlockedbooleanEl número está en la lista de números a los que este sistema no atiende (Cobros IA).
{
    "matches": [
        {
            "id": "1234",
            "name": "Ana Pérez",
            "phones": [
                "51987654321"
            ],
            "document": "4****678",
            "status": "active",
            "plan": "Fibra 100",
            "balance": {
                "amount": 80,
                "currency": "PEN",
                "overdueInvoices": 1
            },
            "nextDueDate": "2026-10-15",
            "zone": "Zona Norte"
        }
    ],
    "numberBlocked": false
}
  • 400 INVALID_REQUEST: phone no tiene entre 7 y 15 dígitos.
  • 401 UNAUTHORIZED: falta la llave o no es válida.
  • 403 FORBIDDEN o INSUFFICIENT_SCOPE.
  • 429 RATE_LIMITED.
  • 500 UNAVAILABLE.
curl \
  -H "Authorization: Bearer TU_LLAVE" \
  "https://TU-DOMINIO/api/v1/customers/lookup?phone=51987654321"

El resumen del cliente más sus servicios, ONU, último pago y tickets abiertos. El documento siempre va enmascarado.

Permiso (scope) requerido: customers:read.

NombreEnTipoObligatorioDescripción
idpathstringSíId del cliente (el que devuelve la búsqueda por celular).
200 Correcto.
CampoTipoDescripción
idstringId del cliente (numérico, como texto).
namestring
phoneslista de stringCelulares, solo dígitos y con código de país.
documentstringDocumento ENMASCARADO: nunca se entrega completo.
statusactive | suspended | pending | retiredEstado del servicio: activo, cortado, en instalación o dado de baja.
planstring · puede ser nullPlan contratado.
balanceobject
balance.amountnumberDeuda pendiente total.
balance.currencystringMoneda (ISO 4217).
balance.overdueInvoicesintegerCantidad de facturas vencidas.
nextDueDatestring · puede ser nullPróximo vencimiento pendiente (AAAA-MM-DD).
zonestring · puede ser null
addressstring · puede ser null
serviceslista de object
services[].planstring
services[].speedcualquieraVelocidad contratada (número).
services[].speedUnitstring · puede ser null
services[].monthlyPricenumber
services[].technologystring · puede ser null
services[].statusstring
onuobject · puede ser nullEstado de la ONU o de la conexión; null si el sistema no lo conoce.
onu.stateonline | offline | unknown
onu.lastSeenstring · puede ser nullFecha y hora en la zona horaria de la empresa (AAAA-MM-DD HH:MM:SS).
lastPaymentobject · puede ser null
lastPayment.datestring
lastPayment.amountnumber
openTicketsintegerTickets abiertos.
acquiredAtstring · puede ser nullFecha del primer contrato (AAAA-MM-DD).
{
    "id": "1234",
    "name": "Ana Pérez",
    "phones": [
        "51987654321"
    ],
    "document": "4****678",
    "status": "active",
    "plan": "Fibra 100",
    "balance": {
        "amount": 80,
        "currency": "PEN",
        "overdueInvoices": 1
    },
    "nextDueDate": "2026-10-15",
    "zone": "Zona Norte",
    "address": "Av. Principal 123",
    "services": [
        {
            "plan": "Fibra 100",
            "speed": 100,
            "speedUnit": "Mbps",
            "monthlyPrice": 30,
            "technology": "Fibra",
            "status": "active"
        }
    ],
    "onu": {
        "state": "online",
        "lastSeen": "2026-10-06 10:40:00"
    },
    "lastPayment": {
        "date": "2026-09-15",
        "amount": 30
    },
    "openTickets": 0,
    "acquiredAt": "2024-03-02"
}
  • 401 UNAUTHORIZED: falta la llave o no es válida.
  • 403 FORBIDDEN o INSUFFICIENT_SCOPE.
  • 404 NOT_FOUND: el cliente no existe.
  • 429 RATE_LIMITED.
  • 500 UNAVAILABLE.
curl \
  -H "Authorization: Bearer TU_LLAVE" \
  "https://TU-DOMINIO/api/v1/customers/1234"

Los clientes de la empresa, de a pocos y por orden de id, cada uno con el mismo resumen de la búsqueda por celular. Pagina con nextCursor → after. Con q busca por nombre, documento, correo o celular (con o sin código de país).

Permiso (scope) requerido: customers:read.

NombreEnTipoObligatorioDescripción
qquerystringNoTexto a buscar: nombre, documento, correo o celular.
statusqueryactive | suspended | pending | retiredNoSolo clientes en ese estado del servicio.
limitqueryinteger · por defecto 25NoCuántos devolver (1 a 100).
afterquerystringNoEl nextCursor de la página anterior.
200 Correcto.
CampoTipoDescripción
customerslista de object
customers[].idstringId del cliente (numérico, como texto).
customers[].namestring
customers[].phoneslista de stringCelulares, solo dígitos y con código de país.
customers[].documentstringDocumento ENMASCARADO: nunca se entrega completo.
customers[].statusactive | suspended | pending | retiredEstado del servicio: activo, cortado, en instalación o dado de baja.
customers[].planstring · puede ser nullPlan contratado.
customers[].balanceobject
customers[].balance.amountnumberDeuda pendiente total.
customers[].balance.currencystringMoneda (ISO 4217).
customers[].balance.overdueInvoicesintegerCantidad de facturas vencidas.
customers[].nextDueDatestring · puede ser nullPróximo vencimiento pendiente (AAAA-MM-DD).
customers[].zonestring · puede ser null
nextCursorstring · puede ser nullPásalo como after para pedir la página siguiente. null = no hay más.
{
    "customers": [
        {
            "id": "1234",
            "name": "Ana Pérez",
            "phones": [
                "51987654321"
            ],
            "document": "4****678",
            "status": "active",
            "plan": "Fibra 100",
            "balance": {
                "amount": 80,
                "currency": "PEN",
                "overdueInvoices": 1
            },
            "nextDueDate": "2026-10-15",
            "zone": "Zona Norte"
        }
    ],
    "nextCursor": "1234"
}
  • 400 INVALID_REQUEST: status o after no son válidos.
  • 401 UNAUTHORIZED: falta la llave o no es válida.
  • 403 FORBIDDEN o INSUFFICIENT_SCOPE.
  • 429 RATE_LIMITED.
  • 500 UNAVAILABLE.
curl \
  -H "Authorization: Bearer TU_LLAVE" \
  "https://TU-DOMINIO/api/v1/customers"

Facturación

Deuda y facturas del cliente.

Facturas del cliente, la de vencimiento más reciente primero.

Permiso (scope) requerido: billing:read.

NombreEnTipoObligatorioDescripción
idpathstringSíId del cliente (el que devuelve la búsqueda por celular).
statusquerypending | paid | all · por defecto pendingNoQué facturas devolver.
limitqueryinteger · por defecto 20NoCuántas devolver (1 a 100).
200 Correcto.
CampoTipoDescripción
invoiceslista de object
invoices[].idstring
invoices[].numberstringSerie y correlativo.
invoices[].issuedAtstring
invoices[].dueDatestring
invoices[].amountnumberTotal.
invoices[].paidnumberPagado.
invoices[].remainingnumberPendiente.
invoices[].currencystring
invoices[].statuspending | partial | paid | void
invoices[].descriptionstring · puede ser null
{
    "invoices": [
        {
            "id": "9001",
            "number": "F001-0000123",
            "issuedAt": "2026-10-01",
            "dueDate": "2026-10-15",
            "amount": 80,
            "paid": 0,
            "remaining": 80,
            "currency": "PEN",
            "status": "pending",
            "description": "Mensualidad octubre"
        }
    ]
}
  • 401 UNAUTHORIZED: falta la llave o no es válida.
  • 403 FORBIDDEN o INSUFFICIENT_SCOPE.
  • 404 NOT_FOUND: el cliente no existe.
  • 429 RATE_LIMITED.
  • 500 UNAVAILABLE.
curl \
  -H "Authorization: Bearer TU_LLAVE" \
  "https://TU-DOMINIO/api/v1/customers/1234/invoices"

La factura completa de un cliente: totales, impuesto, periodo que cubre, líneas y los pagos aplicados. La factura debe ser de ese cliente.

Permiso (scope) requerido: billing:read.

NombreEnTipoObligatorioDescripción
idpathstringSíId del cliente (el que devuelve la búsqueda por celular).
invoiceIdpathstringSíId de la factura (el que devuelve la lista de facturas).
200 Correcto.
CampoTipoDescripción
idstring
numberstringSerie y correlativo.
issuedAtstring
dueDatestring
amountnumberTotal.
paidnumberPagado.
remainingnumberPendiente.
currencystring
statuspending | partial | paid | void
descriptionstring · puede ser null
periodobject · puede ser nullPeriodo que cubre (facturas de servicio).
period.fromstring
period.tostring
subtotalnumber
discountnumber
taxobject
tax.amountnumber
tax.percentnumber
tax.includedbooleanEl precio ya incluye el impuesto.
installmentsobject · puede ser nullSolo si la factura se financió en cuotas.
installments.totalinteger
installments.interestPercentnumber · puede ser null
installments.interestAmountnumber · puede ser null
lineslista de object
lines[].typeservice | product | freeServicio, producto o línea libre.
lines[].descriptionstring
lines[].quantityinteger
lines[].pricenumber
lines[].taxPercentnumber
lines[].totalnumber
paymentslista de objectPagos aplicados a esta factura, del más antiguo al más nuevo.
payments[].idstring
payments[].invoiceIdstring · puede ser nullFactura a la que se aplicó.
payments[].invoiceNumberstring · puede ser null
payments[].datestringFecha y hora en la zona horaria de la empresa (AAAA-MM-DD HH:MM:SS).
payments[].amountnumberMonto pagado.
payments[].currencystring
payments[].methodstring · puede ser nullForma de pago, con el nombre que le da la empresa.
payments[].referencestring · puede ser nullNúmero de operación.
payments[].statusvalid | voidvoid = pago anulado (no se borra).
{
    "id": "9001",
    "number": "F001-0000123",
    "issuedAt": "2026-10-01",
    "dueDate": "2026-10-15",
    "amount": 80,
    "paid": 0,
    "remaining": 80,
    "currency": "PEN",
    "status": "pending",
    "description": "Mensualidad octubre",
    "period": {
        "from": "2026-10-01",
        "to": "2026-10-31"
    },
    "subtotal": 80,
    "discount": 0,
    "tax": {
        "amount": 0,
        "percent": 0,
        "included": false
    },
    "installments": null,
    "lines": [
        {
            "type": "service",
            "description": "Servicio de internet, mes de octubre",
            "quantity": 1,
            "price": 80,
            "taxPercent": 0,
            "total": 80
        }
    ],
    "payments": [
        {
            "id": "5501",
            "invoiceId": "9001",
            "invoiceNumber": "F001-0000123",
            "date": "2026-10-05 14:30:00",
            "amount": 30,
            "currency": "PEN",
            "method": "YAPE",
            "reference": "00845122",
            "status": "valid"
        }
    ]
}
  • 401 UNAUTHORIZED: falta la llave o no es válida.
  • 403 FORBIDDEN o INSUFFICIENT_SCOPE.
  • 404 NOT_FOUND: el cliente o la factura no existen (o la factura no es de ese cliente).
  • 429 RATE_LIMITED.
  • 500 UNAVAILABLE.
curl \
  -H "Authorization: Bearer TU_LLAVE" \
  "https://TU-DOMINIO/api/v1/customers/1234/invoices/{invoiceId}"

Pagos

Medios de pago, promesas de pago y comprobantes.

Las cuentas de cobro activas del país de la empresa (cada banco o billetera con su nombre).

Permiso (scope) requerido: payments:read.

200 Correcto.
CampoTipoDescripción
accountslista de objectCuentas de cobro activas del país de la empresa.
accounts[].bankstringBanco o billetera, con el nombre que le da la empresa.
accounts[].holderstringTitular.
accounts[].numberstringNúmero de cuenta.
accounts[].ccistring · puede ser nullCódigo interbancario (CCI, CLABE, CBU... según el país).
accounts[].phonestring · puede ser nullCelular de la billetera, si aplica.
accounts[].currencystring
accounts[].notestring · puede ser null
instructionsstringTexto sugerido para el cliente.
{
    "accounts": [
        {
            "bank": "Yape",
            "holder": "Mi Empresa SAC",
            "number": "987654321",
            "cci": null,
            "phone": "51987654321",
            "currency": "PEN",
            "note": null
        }
    ],
    "instructions": "Cuando pagues, envíanos la captura del comprobante por este chat."
}
  • 401 UNAUTHORIZED: falta la llave o no es válida.
  • 403 FORBIDDEN o INSUFFICIENT_SCOPE.
  • 429 RATE_LIMITED.
  • 500 UNAVAILABLE.
curl \
  -H "Authorization: Bearer TU_LLAVE" \
  "https://TU-DOMINIO/api/v1/payment-methods"

Registra el compromiso con exactamente la lógica del panel: fechas, candado de penalidad, estado de compromiso y liberación del corte. Repetir la misma Idempotency-Key (máximo 100 caracteres) devuelve la respuesta original SIN volver a ejecutar la operación; se recuerda 24 horas.

Permiso (scope) requerido: payments:write.

NombreEnTipoObligatorioDescripción
idpathstringSíId del cliente (el que devuelve la búsqueda por celular).
Idempotency-KeyheaderstringNoEvita duplicar la operación si reintentas. Máximo 100 caracteres.
CampoTipoObligatorioDescripción
promisedDatestring (date)SíFecha prometida (AAAA-MM-DD). Obligatoria.
notestringNoNota opcional.
invoiceIdstringNoFactura a la que se refiere (debe ser de este cliente). Opcional.
{
    "promisedDate": "2026-10-20",
    "note": "Cobra el viernes"
}
201 Correcto.
CampoTipoDescripción
idstring · puede ser nullId del compromiso vigente.
promisedDatestring
serviceStatusactive | suspended | pending | retiredEstado del servicio tras registrar la promesa (puede reactivarse).
{
    "id": "55",
    "promisedDate": "2026-10-20",
    "serviceStatus": "active"
}
  • 400 INVALID_REQUEST: promisedDate no tiene el formato AAAA-MM-DD.
  • 401 UNAUTHORIZED: falta la llave o no es válida.
  • 403 FORBIDDEN o INSUFFICIENT_SCOPE.
  • 404 NOT_FOUND: el cliente no existe o la factura no es de este cliente.
  • 409 CONFLICT: el cliente no tiene contrato, o el sistema rechazó la promesa (el mensaje dice por qué).
  • 429 RATE_LIMITED.
  • 500 UNAVAILABLE.
curl -X POST \
  -H "Authorization: Bearer TU_LLAVE" \
  -H "Idempotency-Key: UN-ID-UNICO" \
  -H "Content-Type: application/json" \
  -d '{"promisedDate":"2026-10-20","note":"Cobra el viernes"}' \
  "https://TU-DOMINIO/api/v1/customers/1234/payment-promises"

Entrega la imagen o PDF a Cobros IA, que lo lee y lo concilia. Responde 202 de inmediato; el resultado (y el aviso al cliente) llegan después por los canales del sistema. Requiere que Cobros IA esté activado.

Permiso (scope) requerido: payments:write.

NombreEnTipoObligatorioDescripción
idpathstringSíId del cliente (el que devuelve la búsqueda por celular).
CampoTipoObligatorioDescripción
fileUrlstringSíDirección https de la imagen o PDF del comprobante. Obligatoria.
mimeTypestringNoTipo del archivo. Por defecto image/jpeg.
textstringNoTexto que acompañó al comprobante.
{
    "fileUrl": "https://ejemplo.com/comprobante.jpg",
    "mimeType": "image/jpeg"
}
202 Correcto.
CampoTipoDescripción
idstringIdentificador de la captura.
statusreceived
{
    "id": "cap-1a2b3c4d5e6f",
    "status": "received"
}
  • 400 INVALID_REQUEST: fileUrl no es una dirección https.
  • 401 UNAUTHORIZED: falta la llave o no es válida.
  • 403 FORBIDDEN o INSUFFICIENT_SCOPE.
  • 404 NOT_FOUND: el cliente no existe.
  • 409 CONFLICT: Cobros IA no está activado, o el cliente no tiene celular registrado.
  • 429 RATE_LIMITED.
  • 500 UNAVAILABLE.
curl -X POST \
  -H "Authorization: Bearer TU_LLAVE" \
  -H "Content-Type: application/json" \
  -d '{"fileUrl":"https://ejemplo.com/comprobante.jpg","mimeType":"image/jpeg"}' \
  "https://TU-DOMINIO/api/v1/customers/1234/payment-proofs"

Los pagos del cliente entre dos fechas (por defecto los últimos 30 días, hasta 93), el más reciente primero. Un pago anulado no se borra: sale con status: void.

Permiso (scope) requerido: payments:read.

NombreEnTipoObligatorioDescripción
idpathstringSíId del cliente (el que devuelve la búsqueda por celular).
fromquerystring (date)NoDesde (AAAA-MM-DD). Por defecto, 30 días antes de to.
toquerystring (date)NoHasta (AAAA-MM-DD, inclusive). Por defecto, hoy. El rango máximo es de 93 días.
statusqueryvalid | void | all · por defecto validNoPagos válidos, anulados o todos.
limitqueryinteger · por defecto 25NoCuántos devolver (1 a 100).
afterquerystringNoEl nextCursor de la página anterior.
200 Correcto.
CampoTipoDescripción
paymentslista de object
payments[].idstring
payments[].invoiceIdstring · puede ser nullFactura a la que se aplicó.
payments[].invoiceNumberstring · puede ser null
payments[].datestringFecha y hora en la zona horaria de la empresa (AAAA-MM-DD HH:MM:SS).
payments[].amountnumberMonto pagado.
payments[].currencystring
payments[].methodstring · puede ser nullForma de pago, con el nombre que le da la empresa.
payments[].referencestring · puede ser nullNúmero de operación.
payments[].statusvalid | voidvoid = pago anulado (no se borra).
nextCursorstring · puede ser nullPásalo como after para la página siguiente. null = no hay más.
{
    "payments": [
        {
            "id": "5501",
            "invoiceId": "9001",
            "invoiceNumber": "F001-0000123",
            "date": "2026-10-05 14:30:00",
            "amount": 30,
            "currency": "PEN",
            "method": "YAPE",
            "reference": "00845122",
            "status": "valid"
        }
    ],
    "nextCursor": null
}
  • 400 INVALID_REQUEST: las fechas no tienen el formato AAAA-MM-DD, el rango pasa de 93 días, o status / after no son válidos.
  • 401 UNAUTHORIZED: falta la llave o no es válida.
  • 403 FORBIDDEN o INSUFFICIENT_SCOPE.
  • 404 NOT_FOUND: el cliente no existe.
  • 429 RATE_LIMITED.
  • 500 UNAVAILABLE.
curl \
  -H "Authorization: Bearer TU_LLAVE" \
  "https://TU-DOMINIO/api/v1/customers/1234/payments"

Los pagos de TODOS los clientes entre dos fechas (por defecto los últimos 30 días, hasta 93), el más reciente primero. Sirve para conciliar. Cada pago trae su cliente.

Permiso (scope) requerido: payments:read.

NombreEnTipoObligatorioDescripción
fromquerystring (date)NoDesde (AAAA-MM-DD). Por defecto, 30 días antes de to.
toquerystring (date)NoHasta (AAAA-MM-DD, inclusive). Por defecto, hoy. El rango máximo es de 93 días.
statusqueryvalid | void | all · por defecto validNoPagos válidos, anulados o todos.
limitqueryinteger · por defecto 25NoCuántos devolver (1 a 100).
afterquerystringNoEl nextCursor de la página anterior.
200 Correcto.
CampoTipoDescripción
paymentslista de object
payments[].idstring
payments[].invoiceIdstring · puede ser nullFactura a la que se aplicó.
payments[].invoiceNumberstring · puede ser null
payments[].datestringFecha y hora en la zona horaria de la empresa (AAAA-MM-DD HH:MM:SS).
payments[].amountnumberMonto pagado.
payments[].currencystring
payments[].methodstring · puede ser nullForma de pago, con el nombre que le da la empresa.
payments[].referencestring · puede ser nullNúmero de operación.
payments[].statusvalid | voidvoid = pago anulado (no se borra).
payments[].customerobject
payments[].customer.idstring
payments[].customer.namestring
nextCursorstring · puede ser nullPásalo como after para la página siguiente. null = no hay más.
{
    "payments": [
        {
            "id": "5501",
            "invoiceId": "9001",
            "invoiceNumber": "F001-0000123",
            "date": "2026-10-05 14:30:00",
            "amount": 30,
            "currency": "PEN",
            "method": "YAPE",
            "reference": "00845122",
            "status": "valid",
            "customer": {
                "id": "1234",
                "name": "Ana Pérez"
            }
        }
    ],
    "nextCursor": "5501"
}
  • 400 INVALID_REQUEST: las fechas no tienen el formato AAAA-MM-DD, el rango pasa de 93 días, o status / after no son válidos.
  • 401 UNAUTHORIZED: falta la llave o no es válida.
  • 403 FORBIDDEN o INSUFFICIENT_SCOPE.
  • 429 RATE_LIMITED.
  • 500 UNAVAILABLE.
curl \
  -H "Authorization: Bearer TU_LLAVE" \
  "https://TU-DOMINIO/api/v1/payments"

Servicio

Estado del servicio y su corte o reactivación.

Contrato, conexión (en línea o no), ONU y potencia óptica. Lo deja el monitor de la OLT y el colector de tráfico: no consulta el equipo en vivo.

Permiso (scope) requerido: service:read.

NombreEnTipoObligatorioDescripción
idpathstringSíId del cliente (el que devuelve la búsqueda por celular).
200 Correcto.
CampoTipoDescripción
statusactive | suspended | pending | retired
suspendedSincestring · puede ser null
planstring · puede ser null
speedcualquieraVelocidad contratada (número).
speedUnitstring · puede ser null
technologystring · puede ser null
routerstring · puede ser null
connectionobject
connection.stateonline | offline | unknown
connection.lastSeenstring · puede ser nullFecha y hora en la zona horaria de la empresa (AAAA-MM-DD HH:MM:SS).
onuobject · puede ser nullnull si el cliente no tiene ONU vinculada.
onu.serialstring · puede ser null
onu.oltstring · puede ser null
onu.poncualquieraPuerto PON.
onu.stateonline | offline | unknown
onu.causestring · puede ser nullCausa de la caída, si el monitor la conoce.
onu.rxDbmnumber · puede ser nullPotencia óptica recibida (dBm).
onu.rxLevelgood | weak | critical · puede ser nullgood ≥ -25 dBm; weak hasta -27.5; critical por debajo.
onu.updatedAtstring · puede ser nullFecha y hora en la zona horaria de la empresa (AAAA-MM-DD HH:MM:SS).
actionsobject
actions.canSuspendboolean
actions.canActivateboolean
{
    "status": "active",
    "suspendedSince": null,
    "plan": "Fibra 100",
    "speed": 100,
    "speedUnit": "Mbps",
    "technology": "Fibra",
    "router": "RB-Norte",
    "connection": {
        "state": "online",
        "lastSeen": "2026-10-06 10:40:00"
    },
    "onu": {
        "serial": "TPLG12345678",
        "olt": "OLT-1",
        "pon": "1/1/3",
        "state": "online",
        "cause": null,
        "rxDbm": -21.4,
        "rxLevel": "good",
        "updatedAt": "2026-10-06 10:40:00"
    },
    "actions": {
        "canSuspend": true,
        "canActivate": false
    }
}
  • 401 UNAUTHORIZED: falta la llave o no es válida.
  • 403 FORBIDDEN o INSUFFICIENT_SCOPE.
  • 404 NOT_FOUND: el cliente no existe.
  • 429 RATE_LIMITED.
  • 500 UNAVAILABLE.
curl \
  -H "Authorization: Bearer TU_LLAVE" \
  "https://TU-DOMINIO/api/v1/customers/1234/service"

Corta el servicio con los mismos pasos que el botón Cortar del panel (estado del contrato, instalación y corte en el router). Es una acción sobre la red del cliente. Si ya estaba cortado no hace nada (changed: false). Repetir la misma Idempotency-Key (máximo 100 caracteres) devuelve la respuesta original SIN volver a ejecutar la operación; se recuerda 24 horas.

Permiso (scope) requerido: service:suspend.

NombreEnTipoObligatorioDescripción
idpathstringSíId del cliente (el que devuelve la búsqueda por celular).
Idempotency-KeyheaderstringNoEvita duplicar la operación si reintentas. Máximo 100 caracteres.
200 Correcto.
CampoTipoDescripción
statusactive | suspended
changedbooleanfalse si el servicio ya estaba en ese estado (repetir no hace nada).
networkobject
network.appliedbooleanEl corte o la reconexión se aplicó en el router.
network.notestring · puede ser null
{
    "status": "suspended",
    "changed": true,
    "network": {
        "applied": true,
        "note": null
    }
}
  • 401 UNAUTHORIZED: falta la llave o no es válida.
  • 403 FORBIDDEN o INSUFFICIENT_SCOPE.
  • 404 NOT_FOUND: el cliente no existe.
  • 409 CONFLICT: el cliente no tiene contrato, o el servicio está en instalación o dado de baja.
  • 429 RATE_LIMITED.
  • 500 UNAVAILABLE.
curl -X POST \
  -H "Authorization: Bearer TU_LLAVE" \
  -H "Idempotency-Key: UN-ID-UNICO" \
  "https://TU-DOMINIO/api/v1/customers/1234/service/suspend"

Reactiva un servicio cortado con los mismos pasos que el botón Activar del panel. Una baja o una instalación no se reactivan por aquí. Si ya estaba activo no hace nada. Repetir la misma Idempotency-Key (máximo 100 caracteres) devuelve la respuesta original SIN volver a ejecutar la operación; se recuerda 24 horas.

Permiso (scope) requerido: service:activate.

NombreEnTipoObligatorioDescripción
idpathstringSíId del cliente (el que devuelve la búsqueda por celular).
Idempotency-KeyheaderstringNoEvita duplicar la operación si reintentas. Máximo 100 caracteres.
200 Correcto.
CampoTipoDescripción
statusactive | suspended
changedbooleanfalse si el servicio ya estaba en ese estado (repetir no hace nada).
networkobject
network.appliedbooleanEl corte o la reconexión se aplicó en el router.
network.notestring · puede ser null
{
    "status": "active",
    "changed": true,
    "network": {
        "applied": true,
        "note": null
    }
}
  • 401 UNAUTHORIZED: falta la llave o no es válida.
  • 403 FORBIDDEN o INSUFFICIENT_SCOPE.
  • 404 NOT_FOUND: el cliente no existe.
  • 409 CONFLICT: el cliente no tiene contrato, o solo se reactiva un servicio cortado.
  • 429 RATE_LIMITED.
  • 500 UNAVAILABLE.
curl -X POST \
  -H "Authorization: Bearer TU_LLAVE" \
  -H "Idempotency-Key: UN-ID-UNICO" \
  "https://TU-DOMINIO/api/v1/customers/1234/service/activate"

Tickets

Tickets de soporte del cliente.

Hasta 50 tickets, el más reciente primero.

Permiso (scope) requerido: tickets:read.

NombreEnTipoObligatorioDescripción
idpathstringSíId del cliente (el que devuelve la búsqueda por celular).
statusqueryopen | closed | all · por defecto openNoQué tickets devolver.
200 Correcto.
CampoTipoDescripción
ticketslista de objectHasta 50, el más reciente primero.
tickets[].idstring
tickets[].numberstring
tickets[].typestringMotivo del ticket (catálogo de incidencias de la empresa).
tickets[].statusopen | closed
tickets[].createdAtstringFecha y hora en la zona horaria de la empresa (AAAA-MM-DD HH:MM:SS).
tickets[].summarystring · puede ser null
{
    "tickets": [
        {
            "id": "3021",
            "number": "T-3021",
            "type": "AVERIA INTERNET",
            "status": "open",
            "createdAt": "2026-10-06 09:12:00",
            "summary": "Sin internet desde la mañana"
        }
    ]
}
  • 401 UNAUTHORIZED: falta la llave o no es válida.
  • 403 FORBIDDEN o INSUFFICIENT_SCOPE.
  • 404 NOT_FOUND: el cliente no existe.
  • 429 RATE_LIMITED.
  • 500 UNAVAILABLE.
curl \
  -H "Authorization: Bearer TU_LLAVE" \
  "https://TU-DOMINIO/api/v1/customers/1234/tickets"

Crea el ticket con la misma lógica del panel (incluye el aviso al equipo). Repetir la misma Idempotency-Key (máximo 100 caracteres) devuelve la respuesta original SIN volver a ejecutar la operación; se recuerda 24 horas.

Permiso (scope) requerido: tickets:write.

NombreEnTipoObligatorioDescripción
idpathstringSíId del cliente (el que devuelve la búsqueda por celular).
Idempotency-KeyheaderstringNoEvita duplicar la operación si reintentas. Máximo 100 caracteres.
CampoTipoObligatorioDescripción
typeoutage | support | billing | otherNoTipo. Un valor desconocido se toma como other.
descriptionstringSíObligatoria, máximo 500 caracteres.
{
    "type": "outage",
    "description": "Sin internet desde la mañana"
}
201 Correcto.
CampoTipoDescripción
idstring
numberstring
statusopen
{
    "id": "3021",
    "number": "T-3021",
    "status": "open"
}
  • 400 INVALID_REQUEST: falta description o pasa de 500 caracteres.
  • 401 UNAUTHORIZED: falta la llave o no es válida.
  • 403 FORBIDDEN o INSUFFICIENT_SCOPE.
  • 404 NOT_FOUND: el cliente no existe.
  • 409 CONFLICT: no hay motivos de ticket configurados, o el cliente ya tiene un ticket a esa hora.
  • 429 RATE_LIMITED.
  • 500 UNAVAILABLE.
curl -X POST \
  -H "Authorization: Bearer TU_LLAVE" \
  -H "Idempotency-Key: UN-ID-UNICO" \
  -H "Content-Type: application/json" \
  -d '{"type":"outage","description":"Sin internet desde la mañana"}' \
  "https://TU-DOMINIO/api/v1/customers/1234/tickets"

El ticket completo de un cliente: tipo, etapa, prioridad, fechas, técnico asignado y la solución que registró al cerrarlo. El ticket debe ser de ese cliente.

Permiso (scope) requerido: tickets:read.

NombreEnTipoObligatorioDescripción
idpathstringSíId del cliente (el que devuelve la búsqueda por celular).
ticketIdpathstringSíId del ticket (el que devuelve la lista de tickets).
200 Correcto.
CampoTipoDescripción
idstring
numberstring
typestringMotivo del ticket.
statusopen | closed
stagepending | in_progress | resolved | cancelledEtapa: pendiente, en proceso, resuelto o cancelado.
prioritylow | medium | high | urgent
descriptionstring · puede ser null
scheduledAtstringFecha programada de atención. Fecha y hora en la zona horaria de la empresa (AAAA-MM-DD HH:MM:SS).
openedAtstring · puede ser nullCuando el técnico empezó. Fecha y hora en la zona horaria de la empresa (AAAA-MM-DD HH:MM:SS).
closedAtstring · puede ser nullFecha y hora en la zona horaria de la empresa (AAAA-MM-DD HH:MM:SS).
createdAtstringFecha y hora en la zona horaria de la empresa (AAAA-MM-DD HH:MM:SS).
technicianstring · puede ser nullTécnico asignado.
resolutionobject · puede ser nullLa solución que registró el técnico al cerrar.
resolution.commentstring · puede ser null
resolution.closedAtstringFecha y hora en la zona horaria de la empresa (AAAA-MM-DD HH:MM:SS).
{
    "id": "3021",
    "number": "T-3021",
    "type": "AVERIA INTERNET",
    "status": "closed",
    "stage": "resolved",
    "priority": "high",
    "description": "Sin internet desde la mañana",
    "scheduledAt": "2026-10-06 09:12:00",
    "openedAt": "2026-10-06 10:00:00",
    "closedAt": "2026-10-06 11:30:00",
    "createdAt": "2026-10-06 09:12:00",
    "technician": "Luis Rojas",
    "resolution": {
        "comment": "Se cambió el conector",
        "closedAt": "2026-10-06 11:30:00"
    }
}
  • 401 UNAUTHORIZED: falta la llave o no es válida.
  • 403 FORBIDDEN o INSUFFICIENT_SCOPE.
  • 404 NOT_FOUND: el cliente o el ticket no existen (o el ticket no es de ese cliente).
  • 429 RATE_LIMITED.
  • 500 UNAVAILABLE.
curl \
  -H "Authorization: Bearer TU_LLAVE" \
  "https://TU-DOMINIO/api/v1/customers/1234/tickets/{ticketId}"

Cierra el ticket como resuelto, con la misma lógica del panel (solución, fecha y quién lo cerró). Si estaba pendiente, se atiende y se cierra en la misma operación. Un ticket ya resuelto no se vuelve a cerrar (changed: false); uno cancelado no se puede cerrar. Solo lo puede hacer una llave de un usuario administrador. Repetir la misma Idempotency-Key (máximo 100 caracteres) devuelve la respuesta original SIN volver a ejecutar la operación; se recuerda 24 horas.

Permiso (scope) requerido: tickets:close.

NombreEnTipoObligatorioDescripción
idpathstringSíId del cliente (el que devuelve la búsqueda por celular).
Idempotency-KeyheaderstringNoEvita duplicar la operación si reintentas. Máximo 100 caracteres.
CampoTipoObligatorioDescripción
resolutionstringSíLa solución que se registra al cerrar. Obligatoria, máximo 500 caracteres.
notifyCustomerbooleanNoAvisar al cliente que su ticket se resolvió (por los canales del sistema). Por defecto no.
{
    "resolution": "Se cambió el conector",
    "notifyCustomer": false
}
200 Correcto.
CampoTipoDescripción
idstring
numberstring
statusopen | closed
stagepending | in_progress | resolved | cancelled
changedbooleanfalse si el ticket ya estaba resuelto (repetir no hace nada).
closedAtstring · puede ser nullFecha y hora en la zona horaria de la empresa (AAAA-MM-DD HH:MM:SS).
{
    "id": "3021",
    "number": "T-3021",
    "status": "closed",
    "stage": "resolved",
    "changed": true,
    "closedAt": "2026-10-06 11:30:00"
}
  • 400 INVALID_REQUEST: falta resolution o pasa de 500 caracteres.
  • 401 UNAUTHORIZED: falta la llave o no es válida.
  • 403 FORBIDDEN o INSUFFICIENT_SCOPE.
  • 404 NOT_FOUND: el cliente o el ticket no existen (o el ticket no es de ese cliente).
  • 409 CONFLICT: el ticket está cancelado.
  • 429 RATE_LIMITED.
  • 500 UNAVAILABLE.
curl -X POST \
  -H "Authorization: Bearer TU_LLAVE" \
  -H "Idempotency-Key: UN-ID-UNICO" \
  -H "Content-Type: application/json" \
  -d '{"resolution":"Se cambió el conector","notifyCustomer":false}' \
  "https://TU-DOMINIO/api/v1/customers/1234/tickets/{ticketId}/close"

Red

Consumo, routers y conexión del cliente.

Descarga y subida por hora (24h) o por día (7d, 30d), con totales y el pico.

Permiso (scope) requerido: network:read.

NombreEnTipoObligatorioDescripción
idpathstringSíId del cliente (el que devuelve la búsqueda por celular).
rangequery24h | 7d | 30d · por defecto 24hNoPeriodo.
200 Correcto.
CampoTipoDescripción
range24h | 7d | 30d
unithour | dayhour para 24h; day para 7d y 30d.
monitoredbooleanfalse si el router del cliente no envía datos de consumo.
lastTrafficAtstring · puede ser nullFecha y hora en la zona horaria de la empresa (AAAA-MM-DD HH:MM:SS).
totalsobject
totals.downloadBytesinteger
totals.uploadBytesinteger
peakobject · puede ser nullPico de descarga.
peak.atstring
peak.downloadBytesinteger
pointslista de object
points[].atstringHora (AAAA-MM-DD HH:00) o día (AAAA-MM-DD), en la zona de la empresa.
points[].downloadBytesinteger
points[].uploadBytesinteger
{
    "range": "24h",
    "unit": "hour",
    "monitored": true,
    "lastTrafficAt": "2026-10-06 10:55:00",
    "totals": {
        "downloadBytes": 120000000,
        "uploadBytes": 8000000
    },
    "peak": {
        "at": "2026-10-06 09:00",
        "downloadBytes": 120000000
    },
    "points": [
        {
            "at": "2026-10-06 09:00",
            "downloadBytes": 120000000,
            "uploadBytes": 8000000
        }
    ]
}
  • 401 UNAUTHORIZED: falta la llave o no es válida.
  • 403 FORBIDDEN o INSUFFICIENT_SCOPE.
  • 404 NOT_FOUND: el cliente no existe.
  • 409 CONFLICT: el cliente no tiene contrato.
  • 429 RATE_LIMITED.
  • 500 UNAVAILABLE.
curl \
  -H "Authorization: Bearer TU_LLAVE" \
  "https://TU-DOMINIO/api/v1/customers/1234/traffic"

Por cada servicio activo del cliente: su router, el usuario y perfil PPPoE (la clave nunca se entrega), la IP asignada y la cola.

Permiso (scope) requerido: network:read.

NombreEnTipoObligatorioDescripción
idpathstringSíId del cliente (el que devuelve la búsqueda por celular).
200 Correcto.
CampoTipoDescripción
serviceslista de objectServicios activos del cliente.
services[].planstring
services[].speedcualquieraVelocidad contratada (número).
services[].speedUnitstring · puede ser null
services[].technologystring · puede ser null
services[].connectionTypeinternet | personalizadopersonalizado = servicio a medida, sin conexión de internet gestionada.
services[].routerobject · puede ser null
services[].router.idstring
services[].router.namestring
services[].pppoeobject · puede ser nullUsuario y perfil PPPoE. La clave nunca se entrega.
services[].pppoe.userstring
services[].pppoe.profilestring · puede ser null
services[].ipAddressstring · puede ser nullIP asignada.
services[].speedLimitstring · puede ser null
services[].queuestring · puede ser nullCola simple del router.
{
    "services": [
        {
            "plan": "Fibra 100",
            "speed": 100,
            "speedUnit": "MBPS",
            "technology": "FIBRA",
            "connectionType": "internet",
            "router": {
                "id": "1",
                "name": "RB-Norte"
            },
            "pppoe": {
                "user": "72194956",
                "profile": "100Mbps/100Mbps"
            },
            "ipAddress": "10.10.0.15",
            "speedLimit": null,
            "queue": null
        }
    ]
}
  • 401 UNAUTHORIZED: falta la llave o no es válida.
  • 403 FORBIDDEN o INSUFFICIENT_SCOPE.
  • 404 NOT_FOUND: el cliente no existe.
  • 429 RATE_LIMITED.
  • 500 UNAVAILABLE.
curl \
  -H "Authorization: Bearer TU_LLAVE" \
  "https://TU-DOMINIO/api/v1/customers/1234/network"

Los routers con su modelo, si el sistema los gestiona, cuántos clientes tienen y el estado de su monitoreo de tráfico. Nunca se entregan su dirección de gestión, usuarios ni claves.

Permiso (scope) requerido: network:read.

200 Correcto.
CampoTipoDescripción
routerslista de object
routers[].idstring
routers[].namestring
routers[].modelstring · puede ser null
routers[].routerosVersionstring · puede ser null
routers[].managedbooleanEl sistema está conectado a este router para gestionarlo.
routers[].apiEnabledbooleanfalse = el sistema lo trata como desconectado (pruebas o emergencias).
routers[].customersintegerClientes con un servicio activo en este router.
routers[].trafficMonitoringobject
routers[].trafficMonitoring.enabledboolean
routers[].trafficMonitoring.statusstring
routers[].trafficMonitoring.lastSeenstring · puede ser nullFecha y hora en la zona horaria de la empresa (AAAA-MM-DD HH:MM:SS).
{
    "routers": [
        {
            "id": "1",
            "name": "RB-Norte",
            "model": "RB4011",
            "routerosVersion": "7.14",
            "managed": true,
            "apiEnabled": true,
            "customers": 120,
            "trafficMonitoring": {
                "enabled": true,
                "status": "activo",
                "lastSeen": "2026-10-06 10:55:00"
            }
        }
    ]
}
  • 401 UNAUTHORIZED: falta la llave o no es válida.
  • 403 FORBIDDEN o INSUFFICIENT_SCOPE.
  • 429 RATE_LIMITED.
  • 500 UNAVAILABLE.
curl \
  -H "Authorization: Bearer TU_LLAVE" \
  "https://TU-DOMINIO/api/v1/routers"

ONU y OLT

ONU del cliente y OLT de la empresa (el último estado que dejó el monitor).

La ONU vinculada al cliente y su último estado conocido, con la potencia óptica. Lo deja el monitor de la OLT: no consulta el equipo en vivo. onu es null si el cliente no tiene ONU vinculada.

Permiso (scope) requerido: onu:read.

NombreEnTipoObligatorioDescripción
idpathstringSíId del cliente (el que devuelve la búsqueda por celular).
200 Correcto.
CampoTipoDescripción
onuobject · puede ser nullnull si el cliente no tiene ONU vinculada.
onu.serialstring
onu.oltstring · puede ser null
onu.poncualquieraPuerto PON.
onu.stateonline | offline | unknown
onu.causestring · puede ser nullCausa de la caída, si el monitor la conoce.
onu.rxDbmnumber · puede ser nullPotencia óptica recibida (dBm).
onu.rxLevelgood | weak | critical · puede ser nullgood ≥ -25 dBm; weak hasta -27.5; critical por debajo.
onu.updatedAtstring · puede ser nullÚltimo estado del monitor. Fecha y hora en la zona horaria de la empresa (AAAA-MM-DD HH:MM:SS).
onu.linkedAtstring · puede ser nullCuándo se vinculó. Fecha y hora en la zona horaria de la empresa (AAAA-MM-DD HH:MM:SS).
{
    "onu": {
        "serial": "TPLG12345678",
        "olt": "OLT-1",
        "pon": "1/1/3",
        "state": "online",
        "cause": null,
        "rxDbm": -21.4,
        "rxLevel": "good",
        "updatedAt": "2026-10-06 10:40:00",
        "linkedAt": "2026-03-02 09:00:00"
    }
}
  • 401 UNAUTHORIZED: falta la llave o no es válida.
  • 403 FORBIDDEN o INSUFFICIENT_SCOPE.
  • 404 NOT_FOUND: el cliente no existe.
  • 429 RATE_LIMITED.
  • 500 UNAVAILABLE.
curl \
  -H "Authorization: Bearer TU_LLAVE" \
  "https://TU-DOMINIO/api/v1/customers/1234/onu"

Las OLT con cuántas ONU tienen vinculadas a clientes y cuántas están en línea o caídas (según el último estado del monitor). Nunca se entregan sus conexiones (dirección, usuario, clave).

Permiso (scope) requerido: onu:read.

200 Correcto.
CampoTipoDescripción
oltslista de object
olts[].idstring
olts[].namestring
olts[].vendorstring · puede ser null
olts[].modelstring · puede ser null
olts[].zonestring · puede ser null
olts[].onusobject
olts[].onus.linkedintegerONU vinculadas a clientes.
olts[].onus.onlineinteger
olts[].onus.offlineinteger
olts[].onus.unknownintegerSin estado todavía.
olts[].lastUpdatestring · puede ser nullÚltima lectura del monitor. Fecha y hora en la zona horaria de la empresa (AAAA-MM-DD HH:MM:SS).
{
    "olts": [
        {
            "id": "1",
            "name": "OLT-1",
            "vendor": "HUAWEI",
            "model": "MA5800",
            "zone": "Zona Norte",
            "onus": {
                "linked": 120,
                "online": 110,
                "offline": 8,
                "unknown": 2
            },
            "lastUpdate": "2026-10-06 10:40:00"
        }
    ]
}
  • 401 UNAUTHORIZED: falta la llave o no es válida.
  • 403 FORBIDDEN o INSUFFICIENT_SCOPE.
  • 429 RATE_LIMITED.
  • 500 UNAVAILABLE.
curl \
  -H "Authorization: Bearer TU_LLAVE" \
  "https://TU-DOMINIO/api/v1/olts"

Envía el reinicio a la OLT en el acto, con la misma lógica del Portal Cliente. Solo la ONU activa de ese cliente. El cliente pierde la conexión unos minutos. Por seguridad, un reinicio correcto reciente (menos de 5 minutos) de la misma ONU impide otro. Repetir la misma Idempotency-Key (máximo 100 caracteres) devuelve la respuesta original SIN volver a ejecutar la operación; se recuerda 24 horas.

Permiso (scope) requerido: onu:write.

NombreEnTipoObligatorioDescripción
idpathstringSíId del cliente (el que devuelve la búsqueda por celular).
Idempotency-KeyheaderstringNoEvita duplicar la operación si reintentas. Máximo 100 caracteres.
200 Correcto.
CampoTipoDescripción
requestedbooleanEl reinicio se envió a la OLT.
serialstring
oltstring · puede ser null
poncualquieraPuerto PON.
notestring
{
    "requested": true,
    "serial": "TPLG12345678",
    "olt": "OLT-1",
    "pon": "1/1/3",
    "note": "Reinicio enviado: el cliente pierde la conexión unos minutos."
}
  • 401 UNAUTHORIZED: falta la llave o no es válida.
  • 403 FORBIDDEN o INSUFFICIENT_SCOPE.
  • 404 NOT_FOUND: el cliente no existe.
  • 409 CONFLICT: el cliente no tiene ONU vinculada, su equipo no admite reinicio remoto, su servicio está dado de baja, o ya se reinició hace menos de 5 minutos.
  • 429 RATE_LIMITED.
  • 500 UNAVAILABLE.
  • 503 UNAVAILABLE: la OLT o el equipo no respondió.
curl -X POST \
  -H "Authorization: Bearer TU_LLAVE" \
  -H "Idempotency-Key: UN-ID-UNICO" \
  "https://TU-DOMINIO/api/v1/customers/1234/onu/reboot"