Saltar al contenido principal

Visión General de la API

URL Base: https://channel.ozzieapp.com/v1

La Channel API es el único punto de integración para todas las aplicaciones de consumo. Es stateful — gestiona usuarios, autenticación OTP, onboarding, historial de chat y transacciones.

info

La capa de inteligencia está disponible en api.ozzieapp.com pero es un servicio interno. Las aplicaciones de consumo — incluida Lovable — no la llaman directamente. Todas las solicitudes pasan por channel.ozzieapp.com.


Endpoints

MétodoRutaDescripción
POST/v1/auth/otp/requestSolicitar un código OTP de 6 dígitos (WhatsApp o correo)
POST/v1/auth/otp/verifyVerificar código OTP — devuelve user_id + onboarding_stage
POST/v1/usersCrear identidad de usuario
GET/v1/users/:user_idObtener usuario
GET/v1/users/:user_id/profileObtener perfil de usuario del canal (onboarding_stage, plan_speed, etc.)
PATCH/v1/users/:user_id/onboarding/completeAvanzar el onboarding de plan → active
POST/v1/users/:user_id/financial-intakeEnviar intake financiero
GET/v1/users/:user_id/financial-intakeObtener intake
POST/v1/users/:user_id/plan/generateGenerar plan — acepta personality_type en el cuerpo
GET/v1/users/:user_id/planObtener plan
GET/v1/users/:user_id/financial-profileAsignaciones de sobres — acepta ?personality_type=
POST/v1/users/:user_id/chat/completionInferencia de chat IA sin estado
GET/v1/users/:user_id/chat/messagesRecuperar historial de chat
POST/v1/transactions/parseAnálisis de transacciones IA sin estado
GET/v1/personality/questionsCatálogo de preguntas del quiz (no requiere user_id)
POST/v1/personality/scorePuntuar respuestas del quiz y devolver tipo de personalidad
POST/v1/money-moves/generateGenerar recomendaciones de movimientos semanales

Autenticación

HTTP Bearer con un token client_id:client_secret codificado en base64.

Formato del token:

base64(client_id + ":" + client_secret)

Encabezado:

Authorization: Bearer <base64_encoded_credentials>

Generando el token:

const token = Buffer.from(`${clientId}:${clientSecret}`).toString('base64');
// Authorization: `Bearer ${token}`
Mantén las credenciales en el servidor

Nunca expongas tu client_secret en código del lado del cliente, aplicaciones móviles o repositorios públicos. Todas las llamadas a la API deben originarse desde tu backend.


Convenciones de solicitud y respuesta

Encabezados de solicitud

EncabezadoRequeridoValor
AuthorizationBearer <token>
Content-TypeSí (POST/PATCH)application/json
Idempotency-KeyNoUUID v4 — para solicitudes POST idempotentes

Envelope de respuesta

{
"object": "object_type_name",
"data": { ... }
}

Códigos de estado HTTP

EstadoSignificado
200 OKSolicitud exitosa
201 CreatedRecurso creado
400 Bad RequestJSON malformado o error de validación
401 UnauthorizedCredenciales ausentes o inválidas
403 ForbiddenCredenciales válidas, permisos insuficientes
404 Not FoundEl recurso no existe
409 ConflictEl recurso ya existe
422 Unprocessable EntityError de lógica de negocio (ej., intake faltante)
429 Too Many RequestsLímite de tasa excedido
500 Internal Server ErrorError en el servidor

Códigos de error

Todos los errores siguen esta estructura:

{
"error": {
"code": "ERROR_CODE",
"message": "Human-readable explanation."
}
}
CódigoHTTPDescripción
INVALID_JSON400El cuerpo de la solicitud no es JSON válido
VALIDATION_ERROR400Un campo falló la validación
INVALID_CODE400El código OTP es incorrecto o ya fue utilizado
CODE_EXPIRED400El código OTP superó su TTL de 10 minutos
UNAUTHORIZED401Credenciales ausentes o inválidas
FORBIDDEN403Credenciales válidas pero acceso denegado
NOT_FOUND404El recurso no existe
CONFLICT409Conflicto de restricción única (ej., external_user_id duplicado)
INTAKE_REQUIRED422Primero debe enviarse el intake financiero
PLAN_REQUIRED422Primero debe generarse el plan
RATE_LIMIT_EXCEEDED429Límite de tasa excedido — consulta el encabezado Retry-After
INTERNAL_ERROR500Error inesperado en el servidor

Límite de tasa

Los límites de tasa se aplican por client_id. Al excederlos, la API devuelve HTTP 429:

HTTP/1.1 429 Too Many Requests
Retry-After: 15
X-RateLimit-Limit: 120
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1746460800
TierSolicitudes por minuto
Standard120
Growth600
EnterprisePersonalizado

Implementa siempre backoff exponencial al manejar respuestas 429.