API REST — Integración de suscripciones
Endpoints para que la web comercial de Help U consulte planes, cotice por alumnos, valide colegios y confirme pagos de suscripción en Huella.
1. Introducción
Huella expone una API REST para que la página web comercial (checkout de planes) sincronice pagos de suscripción con el panel multi-tenant de colegios. La pasarela de pago vive en la web; Huella no aloja el formulario de cobro, solo recibe la confirmación del pago exitoso.
- Consulta de planes activos y tarifas por rango de alumnos.
- Cotización de precio por plan, alumnos y periodo de facturación.
- Consulta de temas visuales, ciudades y municipios.
- Alta de colegio (empresa) + administrador sin pasar por demo.
- Validación de empresa por NIT o correo antes del checkout.
- Registro del pago, renovación de suscripción y activación opcional.
Para operación del panel (empresas, demos, avisos) consulte el manual de SuperAdmin. Para el colegio (configuración, académico, RRHH, finanzas), use el manual de usuario.
2. Autenticación
Todos los endpoints requieren un token compartido configurado en el servidor Huella (HUELLA_API_TOKEN).
| Encabezado | Valor |
|---|---|
Authorization |
Bearer {HUELLA_API_TOKEN} recomendado |
X-Huella-Token |
{HUELLA_API_TOKEN} (alternativa) |
Respuestas de autenticación:
| HTTP | error | Causa |
|---|---|---|
| 401 | no_autorizado | Token ausente o incorrecto. |
| 503 | api_no_configurada | HUELLA_API_TOKEN vacío en .env. |
3. URL base y convenciones
- Prefijo: todas las rutas están bajo
/api. - Formato: JSON en peticiones (
Content-Type: application/json) y respuestas. - Fechas: formato
Y-m-d(ej.2026-07-05). - Moneda: valores numéricos en COP sin separadores.
- NIT: 9 dígitos sin dígito de verificación ni guión.
Ejemplo de URL base en producción (ajuste en config.php de esta carpeta):
https://huella.su-dominio.com/api
4. Listar planes
GET /api/public/planes
Devuelve el catálogo activo para la web comercial (Demo, Básico, Profesional).
El query tipo acepta plataforma o app (mismo resultado; default plataforma).
Parámetros (query string)
| Parámetro | Valores | Descripción |
|---|---|---|
tipo |
plataforma · app |
Opcional. Default: plataforma. |
Respuesta 200
{
"ok": true,
"tipo": "plataforma",
"planes": [
{
"plan_id": 2,
"codigo": "basico",
"nombre": "Básico",
"tipo": "plataforma",
"dias_aviso": 7,
"activo": true,
"es_demo": false,
"capacidades": ["Estudiantes", "Calificaciones", "Boletines"],
"tarifas": [
{
"rango_alumnos_id": 1,
"etiqueta": "Hasta 50 alumnos",
"alumnos_desde": 1,
"alumnos_hasta": 50,
"requiere_cotizacion": false,
"precio_mensual": 80000,
"precio_mensual_fmt": "$80.000"
}
],
"periodos": [
{
"periodo_facturacion_id": 1,
"codigo": "mensual",
"nombre": "Mensual",
"meses": 1,
"descuento_pct": 0
}
]
}
]
}
capacidades son nombres legibles de módulos incluidos.
Tarifas por rango de alumnos y periodos de facturación (mensual, trimestral, semestral, anual).
Detalle operativo: manual SuperAdmin.
5. Cotizar plan
GET /api/public/cotizar
Calcula el precio del periodo según plan, cantidad de alumnos y periodo de facturación.
Parámetros
| Parámetro | Tipo | Descripción |
|---|---|---|
plan | integer o string | Obligatorio. ID del plan o código (demo, basico, profesional). |
alumnos | integer (min 1) | Obligatorio. Alumnos contratados; define el rango tarifario. Demo admite hasta 50. |
periodo | integer o string | Opcional. ID o código (mensual, trimestral, semestral, anual). Demo solo admite trimestral. |
Respuesta 200: { "ok": true, "cotizacion": { ... } }. Si el rango exige cotización personalizada, cotizacion.ok es false y requiere_cotizacion es true.
6. Listar temas
GET /api/public/temas
Temas visuales disponibles para registro o selección en la web comercial. El tag se usa en login: /login?tag=….
Respuesta 200 (extracto)
{
"ok": true,
"temas": {
"default": {
"id": 1,
"show_name": "Predeterminado",
"primary": "#1B4F8A",
"tag": "baDZr8M69O"
},
"red": { "id": 2, "show_name": "Rojo", "tag": "8XmnVjnR1L" }
}
}
7. Listar ciudades
GET /api/public/ciudades
{
"ok": true,
"ciudades": [
{ "ciudad_id": 1, "nombre": "Cundinamarca" }
]
}
8. Listar municipios
GET /api/public/municipios?ciudad_id=1
El municipio_id se usa en POST /public/empresas.
{
"ok": true,
"ciudad_id": 1,
"municipios": [
{
"municipio_id": 912,
"ciudad_id": 1,
"nombre": "Soacha",
"codigo_dane": "25754"
}
]
}
9. Consultar empresa (colegio)
GET /api/public/empresas/consulta
Valida si existe un colegio cliente antes del pago. Indique nit y/o email.
Respuesta 200
{
"ok": true,
"existe": true,
"activo": true,
"empresa": {
"empresa_id": 12,
"nombre": "Colegio Ejemplo",
"nit": "900123456",
"email": "admin@colegio.edu.co",
"activo": true,
"plan_actual": "basico",
"plan_nombre": "Básico",
"plan_vence": "2026-08-04",
"es_demo": false,
"dias_restantes": 20,
"estado_suscripcion": "al_dia"
}
}
Si no existe: existe: false, empresa: null (HTTP 200).
Estados: al_dia, proximo_vencer, vencido.
No se expone la empresa gestora.
10. Alta comercial (sin demo)
POST /api/public/empresas
Crea un colegio con su administrador sin plan demo.
Queda activo: false hasta el webhook de pago.
Cuerpo JSON
| Campo | Obligatorio | Descripción |
|---|---|---|
nit | Sí | 9 dígitos, sin DV ni guión. |
nombre | Sí | Nombre del colegio / razón social. |
direccion | Sí | Dirección. |
barrio | Sí | Barrio (máx. 80). |
telefono | Sí | Teléfono de contacto. |
email | Sí | Correo (también usuario admin). |
municipio_id | Sí | ID de municipio en Huella. |
tema_id | Sí | ID de tema (GET /public/temas). |
Ejemplo
{
"nit": "900999888",
"nombre": "Colegio Los Álamos",
"direccion": "Calle 10 # 20-30",
"barrio": "Centro",
"telefono": "3001234567",
"email": "admin@losalamos.edu.co",
"municipio_id": 912,
"tema_id": 1
}
activar_empresa: true.
11. Confirmar pago de suscripción
POST /api/webhooks/suscripcion/pago
Llame este endpoint después de que la pasarela confirme el cobro. Huella registra el pago, renueva la suscripción y, por defecto, activa el colegio si estaba inactivo.
Cuerpo JSON
| Campo | Obligatorio | Descripción |
|---|---|---|
referencia | Sí | ID único de la transacción (idempotencia). |
valor | Sí | Monto pagado; debe coincidir con la cotización (±1 COP). |
alumnos | Sí | Alumnos contratados. |
empresa_id / nit / email | Uno de tres | Identificación del colegio. |
plan_id / plan_codigo | Uno de dos | Plan (demo, basico, profesional). |
periodo_codigo / periodo_facturacion_id | Uno de dos | Periodo de facturación. |
fecha_pago | No | Por defecto hoy. |
pasarela | No | Ej. WOMPI. |
activar_empresa | No | Default true. |
reset_datos_demo | No | true borra datos operativos al salir de demo. Default false. |
observaciones | No | Máx. 500 caracteres. |
- Demo vigente → plan pago: inicia hoy y suma los días restantes del demo.
- Demo vencido → plan pago: inicia hoy, sin bonus.
- Renovación pago → pago (vigente): el nuevo periodo empieza el día siguiente al vencimiento actual.
Ejemplo
{
"referencia": "TX-98437261",
"nit": "900123456",
"plan_codigo": "basico",
"alumnos": 50,
"periodo_codigo": "mensual",
"valor": 80000,
"pasarela": "WOMPI",
"activar_empresa": true,
"reset_datos_demo": false
}
Respuesta 201 (pago nuevo) o 200 si idempotente: true (misma referencia ya procesada).
12. Códigos de error
| HTTP | error | Descripción |
|---|---|---|
| 401 | no_autorizado | Token inválido. |
| 422 | validacion | Datos incompletos o reglas de negocio. |
| 500 | error_interno | Error inesperado; reintentar con la misma referencia. |
| 503 | api_no_configurada | Token no configurado en el servidor. |
13. Idempotencia y referencias
Huella antepone un prefijo a la referencia de la pasarela.
Formato: WEB[-PASARELA]-referencia.
Variable: HUELLA_PAGO_PREFIJO (default WEB).
| Entrada | Referencia almacenada |
|---|---|
referencia: "TX-001" | WEB-TX-001 |
referencia: "TX-001", pasarela: "WOMPI" | WEB-WOMPI-TX-001 |
14. Flujo recomendado (web comercial)
Cliente nuevo que paga (sin demo)
- Planes y cotización:
GET /planes,GET /cotizar, temas y municipios. - Registrar colegio:
POST /empresas→empresa_id. - Cobrar en la pasarela con el monto cotizado.
- Confirmar:
POST /webhooks/suscripcion/pagocon plan, alumnos, periodo yactivar_empresa: true. - Login: correo de la empresa y clave = NIT (9 dígitos).
Cliente existente / demo
GET /empresas/consulta(NIT o correo).- Checkout Help U → cobro →
POST /webhooks/suscripcion/pago(opcionalreset_datos_demo: true).
Las solicitudes de demo desde /registro crean colegios inactivos con plan demo;
se activan con este webhook o desde el panel (ver bandeja de demos).
15. Configuración en Huella
Variables en el .env del servidor Huella:
| Variable | Descripción |
|---|---|
HUELLA_API_TOKEN | Token secreto compartido con la web. Generar: php -r "echo bin2hex(random_bytes(32));" |
HUELLA_PAGO_PREFIJO | Prefijo de referencias (default WEB). |