{"openapi":"3.1.0","info":{"title":"StartISP Platform API","version":"0.1.0","description":"API del plano de control de StartISP. Los datos demo de la aplicación anterior no forman parte de esta API."},"servers":[{"url":"/"}],"tags":[{"name":"Auth","description":"Cuenta y sesión propias de StartISP."},{"name":"Account","description":"Cuenta autenticada y organizaciones asignadas."},{"name":"Master admin","description":"Consulta global con platform.read; las mutaciones requieren platform.admin."}],"paths":{"/health":{"get":{"summary":"Estado del proceso","responses":{"200":{"description":"OK"}}}},"/ready":{"get":{"summary":"Preparación de PostgreSQL","responses":{"200":{"description":"Ready"},"503":{"description":"Not ready"}}}},"/api/auth/register":{"post":{"tags":["Auth"],"summary":"Registrar una cuenta pendiente de verificación","responses":{"202":{"description":"Operación exitosa"},"400":{"description":"Solicitud inválida"},"401":{"description":"Autenticación requerida"},"403":{"description":"Acceso denegado"}}}},"/api/auth/verify-email":{"post":{"tags":["Auth"],"summary":"Verificar el correo con token de un solo uso","responses":{"200":{"description":"Operación exitosa"},"400":{"description":"Solicitud inválida"},"401":{"description":"Autenticación requerida"},"403":{"description":"Acceso denegado"}}}},"/api/auth/resend-verification":{"post":{"tags":["Auth"],"summary":"Reenviar verificación sin revelar cuentas","responses":{"202":{"description":"Operación exitosa"},"400":{"description":"Solicitud inválida"},"401":{"description":"Autenticación requerida"},"403":{"description":"Acceso denegado"}}}},"/api/auth/login":{"post":{"tags":["Auth"],"summary":"Crear sesión propia de StartISP","responses":{"200":{"description":"Operación exitosa"},"400":{"description":"Solicitud inválida"},"401":{"description":"Autenticación requerida"},"403":{"description":"Acceso denegado"}}}},"/api/auth/session":{"get":{"tags":["Auth"],"summary":"Consultar sesión y rotar el token CSRF","responses":{"200":{"description":"Operación exitosa"},"400":{"description":"Solicitud inválida"},"401":{"description":"Autenticación requerida"},"403":{"description":"Acceso denegado"}}}},"/api/auth/logout":{"post":{"tags":["Auth"],"summary":"Revocar la sesión actual","parameters":[{"in":"header","name":"X-CSRF-Token","required":true,"schema":{"type":"string"},"description":"Token devuelto por login o GET /api/auth/session."}],"responses":{"200":{"description":"Operación exitosa"},"400":{"description":"Solicitud inválida"},"401":{"description":"Autenticación requerida"},"403":{"description":"Acceso denegado"}}}},"/api/auth/forgot-password":{"post":{"tags":["Auth"],"summary":"Solicitar restablecimiento sin revelar cuentas","responses":{"202":{"description":"Operación exitosa"},"400":{"description":"Solicitud inválida"},"401":{"description":"Autenticación requerida"},"403":{"description":"Acceso denegado"}}}},"/api/auth/reset-password":{"post":{"tags":["Auth"],"summary":"Restablecer contraseña y revocar sesiones","responses":{"200":{"description":"Operación exitosa"},"400":{"description":"Solicitud inválida"},"401":{"description":"Autenticación requerida"},"403":{"description":"Acceso denegado"}}}},"/api/auth/accept-invitation":{"post":{"tags":["Auth"],"summary":"Aceptar una invitación, fijar contraseña y activar la cuenta","responses":{"200":{"description":"Operación exitosa"},"400":{"description":"Solicitud inválida"},"401":{"description":"Autenticación requerida"},"403":{"description":"Acceso denegado"}}}},"/api/account/overview":{"get":{"tags":["Account"],"summary":"Consultar empresas, roles y suscripción de la cuenta","security":[{"sessionCookie":[]}],"responses":{"200":{"description":"Operación exitosa"},"400":{"description":"Solicitud inválida"},"401":{"description":"Autenticación requerida"},"403":{"description":"Acceso denegado"}}}},"/api/account/workspace-ticket":{"post":{"tags":["Account"],"summary":"Crear acceso de un solo uso al panel ISP","security":[{"sessionCookie":[]}],"parameters":[{"in":"header","name":"X-CSRF-Token","required":true,"schema":{"type":"string"},"description":"Token devuelto por login o GET /api/auth/session."}],"responses":{"201":{"description":"Operación exitosa"},"400":{"description":"Solicitud inválida"},"401":{"description":"Autenticación requerida"},"403":{"description":"Acceso denegado"}}}},"/api/admin/overview":{"get":{"tags":["Master admin"],"summary":"Totales limpios del plano de control","security":[{"sessionCookie":[]}],"responses":{"200":{"description":"Operación exitosa"},"400":{"description":"Solicitud inválida"},"401":{"description":"Autenticación requerida"},"403":{"description":"Acceso denegado"}}}},"/api/admin/email-settings":{"get":{"tags":["Master admin"],"summary":"Consultar configuración de correo sin devolver contraseñas","security":[{"sessionCookie":[]}],"responses":{"200":{"description":"Operación exitosa"},"400":{"description":"Solicitud inválida"},"401":{"description":"Autenticación requerida"},"403":{"description":"Acceso denegado"}}},"put":{"tags":["Master admin"],"summary":"Verificar SMTP y guardar sus credenciales cifradas","security":[{"sessionCookie":[]}],"parameters":[{"in":"header","name":"X-CSRF-Token","required":true,"schema":{"type":"string"},"description":"Token devuelto por login o GET /api/auth/session."}],"responses":{"200":{"description":"Operación exitosa"},"400":{"description":"Solicitud inválida"},"401":{"description":"Autenticación requerida"},"403":{"description":"Acceso denegado"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["username","senderName","port","enabled"],"properties":{"username":{"type":"string","format":"email"},"senderName":{"type":"string","maxLength":120},"port":{"type":"integer","enum":[465,587]},"enabled":{"type":"boolean"},"password":{"type":"string","writeOnly":true,"description":"Contraseña del buzón. Vacía conserva la existente."},"revision":{"type":"integer","description":"Versión devuelta por GET para impedir sobrescrituras concurrentes."}}}}}}}},"/api/admin/email-settings/test":{"post":{"tags":["Master admin"],"summary":"Enviar una prueba al correo del administrador autenticado","security":[{"sessionCookie":[]}],"parameters":[{"in":"header","name":"X-CSRF-Token","required":true,"schema":{"type":"string"},"description":"Token devuelto por login o GET /api/auth/session."}],"responses":{"202":{"description":"Operación exitosa"},"400":{"description":"Solicitud inválida"},"401":{"description":"Autenticación requerida"},"403":{"description":"Acceso denegado"}}}},"/api/admin/users":{"get":{"tags":["Master admin"],"summary":"Listar usuarios StartISP","security":[{"sessionCookie":[]}],"responses":{"200":{"description":"Operación exitosa"},"400":{"description":"Solicitud inválida"},"401":{"description":"Autenticación requerida"},"403":{"description":"Acceso denegado"}}}},"/api/admin/users/invite":{"post":{"tags":["Master admin"],"summary":"Crear o reenviar una invitación de usuario pendiente","security":[{"sessionCookie":[]}],"parameters":[{"in":"header","name":"X-CSRF-Token","required":true,"schema":{"type":"string"},"description":"Token devuelto por login o GET /api/auth/session."}],"responses":{"202":{"description":"Operación exitosa"},"400":{"description":"Solicitud inválida"},"401":{"description":"Autenticación requerida"},"403":{"description":"Acceso denegado"}}}},"/api/admin/users/{id}":{"patch":{"tags":["Master admin"],"summary":"Actualizar un usuario","security":[{"sessionCookie":[]}],"parameters":[{"in":"header","name":"X-CSRF-Token","required":true,"schema":{"type":"string"},"description":"Token devuelto por login o GET /api/auth/session."}],"responses":{"200":{"description":"Operación exitosa"},"400":{"description":"Solicitud inválida"},"401":{"description":"Autenticación requerida"},"403":{"description":"Acceso denegado"}}},"delete":{"tags":["Master admin"],"summary":"Deshabilitar usuario y revocar sesiones","security":[{"sessionCookie":[]}],"parameters":[{"in":"header","name":"X-CSRF-Token","required":true,"schema":{"type":"string"},"description":"Token devuelto por login o GET /api/auth/session."}],"responses":{"200":{"description":"Operación exitosa"},"400":{"description":"Solicitud inválida"},"401":{"description":"Autenticación requerida"},"403":{"description":"Acceso denegado"}}}},"/api/admin/roles":{"get":{"tags":["Master admin"],"summary":"Listar roles de plataforma","security":[{"sessionCookie":[]}],"responses":{"200":{"description":"Operación exitosa"},"400":{"description":"Solicitud inválida"},"401":{"description":"Autenticación requerida"},"403":{"description":"Acceso denegado"}}},"post":{"tags":["Master admin"],"summary":"Crear rol de plataforma","security":[{"sessionCookie":[]}],"parameters":[{"in":"header","name":"X-CSRF-Token","required":true,"schema":{"type":"string"},"description":"Token devuelto por login o GET /api/auth/session."}],"responses":{"201":{"description":"Operación exitosa"},"400":{"description":"Solicitud inválida"},"401":{"description":"Autenticación requerida"},"403":{"description":"Acceso denegado"}}}},"/api/admin/users/{id}/roles/{roleCode}":{"put":{"tags":["Master admin"],"summary":"Asignar rol de plataforma","security":[{"sessionCookie":[]}],"parameters":[{"in":"header","name":"X-CSRF-Token","required":true,"schema":{"type":"string"},"description":"Token devuelto por login o GET /api/auth/session."}],"responses":{"200":{"description":"Operación exitosa"},"400":{"description":"Solicitud inválida"},"401":{"description":"Autenticación requerida"},"403":{"description":"Acceso denegado"}}},"delete":{"tags":["Master admin"],"summary":"Retirar rol de plataforma","security":[{"sessionCookie":[]}],"parameters":[{"in":"header","name":"X-CSRF-Token","required":true,"schema":{"type":"string"},"description":"Token devuelto por login o GET /api/auth/session."}],"responses":{"200":{"description":"Operación exitosa"},"400":{"description":"Solicitud inválida"},"401":{"description":"Autenticación requerida"},"403":{"description":"Acceso denegado"}}}},"/api/admin/tenants":{"get":{"tags":["Master admin"],"summary":"Listar empresas ISP","security":[{"sessionCookie":[]}],"responses":{"200":{"description":"Operación exitosa"},"400":{"description":"Solicitud inválida"},"401":{"description":"Autenticación requerida"},"403":{"description":"Acceso denegado"}}},"post":{"tags":["Master admin"],"summary":"Crear una empresa ISP real","security":[{"sessionCookie":[]}],"parameters":[{"in":"header","name":"X-CSRF-Token","required":true,"schema":{"type":"string"},"description":"Token devuelto por login o GET /api/auth/session."}],"responses":{"201":{"description":"Operación exitosa"},"400":{"description":"Solicitud inválida"},"401":{"description":"Autenticación requerida"},"403":{"description":"Acceso denegado"}}}},"/api/admin/tenants/{id}":{"patch":{"tags":["Master admin"],"summary":"Actualizar una empresa ISP","security":[{"sessionCookie":[]}],"parameters":[{"in":"header","name":"X-CSRF-Token","required":true,"schema":{"type":"string"},"description":"Token devuelto por login o GET /api/auth/session."}],"responses":{"200":{"description":"Operación exitosa"},"400":{"description":"Solicitud inválida"},"401":{"description":"Autenticación requerida"},"403":{"description":"Acceso denegado"}}}},"/api/admin/memberships":{"get":{"tags":["Master admin"],"summary":"Listar asignaciones de usuarios a empresas","security":[{"sessionCookie":[]}],"responses":{"200":{"description":"Operación exitosa"},"400":{"description":"Solicitud inválida"},"401":{"description":"Autenticación requerida"},"403":{"description":"Acceso denegado"}}}},"/api/admin/tenants/{tenantId}/roles":{"get":{"tags":["Master admin"],"summary":"Listar roles disponibles en una empresa","security":[{"sessionCookie":[]}],"responses":{"200":{"description":"Operación exitosa"},"400":{"description":"Solicitud inválida"},"401":{"description":"Autenticación requerida"},"403":{"description":"Acceso denegado"}}}},"/api/admin/tenants/{tenantId}/members/{userId}":{"put":{"tags":["Master admin"],"summary":"Asignar o actualizar un usuario dentro de una empresa","security":[{"sessionCookie":[]}],"parameters":[{"in":"header","name":"X-CSRF-Token","required":true,"schema":{"type":"string"},"description":"Token devuelto por login o GET /api/auth/session."}],"responses":{"200":{"description":"Operación exitosa"},"400":{"description":"Solicitud inválida"},"401":{"description":"Autenticación requerida"},"403":{"description":"Acceso denegado"}}},"delete":{"tags":["Master admin"],"summary":"Deshabilitar la asignación de un usuario","security":[{"sessionCookie":[]}],"parameters":[{"in":"header","name":"X-CSRF-Token","required":true,"schema":{"type":"string"},"description":"Token devuelto por login o GET /api/auth/session."}],"responses":{"200":{"description":"Operación exitosa"},"400":{"description":"Solicitud inválida"},"401":{"description":"Autenticación requerida"},"403":{"description":"Acceso denegado"}}}},"/api/admin/products":{"get":{"tags":["Master admin"],"summary":"Listar productos SaaS","security":[{"sessionCookie":[]}],"responses":{"200":{"description":"Operación exitosa"},"400":{"description":"Solicitud inválida"},"401":{"description":"Autenticación requerida"},"403":{"description":"Acceso denegado"}}},"post":{"tags":["Master admin"],"summary":"Crear producto SaaS","security":[{"sessionCookie":[]}],"parameters":[{"in":"header","name":"X-CSRF-Token","required":true,"schema":{"type":"string"},"description":"Token devuelto por login o GET /api/auth/session."}],"responses":{"201":{"description":"Operación exitosa"},"400":{"description":"Solicitud inválida"},"401":{"description":"Autenticación requerida"},"403":{"description":"Acceso denegado"}}}},"/api/admin/prices":{"get":{"tags":["Master admin"],"summary":"Listar precios configurados","security":[{"sessionCookie":[]}],"responses":{"200":{"description":"Operación exitosa"},"400":{"description":"Solicitud inválida"},"401":{"description":"Autenticación requerida"},"403":{"description":"Acceso denegado"}}},"post":{"tags":["Master admin"],"summary":"Crear precio","security":[{"sessionCookie":[]}],"parameters":[{"in":"header","name":"X-CSRF-Token","required":true,"schema":{"type":"string"},"description":"Token devuelto por login o GET /api/auth/session."}],"responses":{"201":{"description":"Operación exitosa"},"400":{"description":"Solicitud inválida"},"401":{"description":"Autenticación requerida"},"403":{"description":"Acceso denegado"}}}},"/api/admin/subscriptions":{"get":{"tags":["Master admin"],"summary":"Listar suscripciones","security":[{"sessionCookie":[]}],"responses":{"200":{"description":"Operación exitosa"},"400":{"description":"Solicitud inválida"},"401":{"description":"Autenticación requerida"},"403":{"description":"Acceso denegado"}}},"post":{"tags":["Master admin"],"summary":"Crear una suscripción","security":[{"sessionCookie":[]}],"parameters":[{"in":"header","name":"X-CSRF-Token","required":true,"schema":{"type":"string"},"description":"Token devuelto por login o GET /api/auth/session."}],"responses":{"201":{"description":"Operación exitosa"},"400":{"description":"Solicitud inválida"},"401":{"description":"Autenticación requerida"},"403":{"description":"Acceso denegado"}}}},"/api/admin/subscriptions/{id}":{"patch":{"tags":["Master admin"],"summary":"Actualizar una suscripción","security":[{"sessionCookie":[]}],"parameters":[{"in":"header","name":"X-CSRF-Token","required":true,"schema":{"type":"string"},"description":"Token devuelto por login o GET /api/auth/session."}],"responses":{"200":{"description":"Operación exitosa"},"400":{"description":"Solicitud inválida"},"401":{"description":"Autenticación requerida"},"403":{"description":"Acceso denegado"}}}}},"components":{"securitySchemes":{"sessionCookie":{"type":"apiKey","in":"cookie","name":"__Host-startisp_session"}},"schemas":{"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}