Saltar al contenido principal

Auth

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

Los endpoints de Auth autentican a los usuarios finales mediante un código OTP de 6 dígitos entregado por WhatsApp o correo electrónico. Esto es distinto de la autenticación del cliente de API (que usa un token Bearer estático) — el OTP es para el usuario humano dentro de tu aplicación.

info

Para una descripción conceptual de cómo el OTP encaja en el flujo completo de onboarding, consulta Arquitectura.


Detalles del OTP

PropiedadValor
Longitud del código6 dígitos
TTL10 minutos
Uso únicoSí — invalidado al primer verificado exitoso
AlmacenamientoHasheado con bcrypt
identifierTeléfono E.164 (ej. +5511999990000) o dirección de correo electrónico
Detección automática de channelTeléfono E.164 → whatsapp; dirección de correo → email

POST /v1/auth/otp/request

Genera un código OTP de 6 dígitos y lo entrega al usuario por WhatsApp o correo electrónico.

Cuerpo de la solicitud

CampoTipoRequeridoDescripción
identifierstringTeléfono en formato E.164 o dirección de correo electrónico
channelstringNo"whatsapp" o "email". Detectado automáticamente desde identifier si se omite.
languagestringNo"pt" | "en" | "es" — idioma del mensaje OTP. Por defecto "en".
curl -X POST https://channel.ozzieapp.com/v1/auth/otp/request \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"identifier": "+5511999990000",
"language": "pt"
}'

Respuesta (200 OK):

{
"object": "otp_request",
"data": {
"channel": "whatsapp",
"masked": "+55119****0000",
"expires_at": "2026-05-16T14:40:00Z"
}
}
CampoDescripción
channelCanal de entrega utilizado: "whatsapp" o "email"
maskedVersión enmascarada del identificador — seguro para mostrar al usuario como confirmación
expires_atTimestamp ISO 8601 de cuando expira el código (10 minutos desde su emisión)

POST /v1/auth/otp/verify

Verifica el código OTP que ingresó el usuario. Si tiene éxito, devuelve el user_id de Ozzie y el onboarding_stage actual del usuario.

Cuerpo de la solicitud

CampoTipoRequeridoDescripción
identifierstringEl mismo teléfono o correo usado en el paso de solicitud
codestringCódigo de 6 dígitos que recibió el usuario
curl -X POST https://channel.ozzieapp.com/v1/auth/otp/verify \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"identifier": "+5511999990000",
"code": "482910"
}'

Respuesta (200 OK):

{
"object": "otp_verify",
"data": {
"user_id": "external:usr_8821",
"core_user_id": "ozz_usr_01HX9KZMR4P5JQNBVT7YCW3DE",
"onboarding_stage": "financial_intake"
}
}
CampoDescripción
user_idEl identificador de usuario de Ozzie en formato external:{id} — úsalo en los parámetros de ruta subsiguientes
core_user_idEl UUID interno de Ozzie
onboarding_stageEtapa actual: financial_intake | personality | plan | active

Errores

CódigoHTTPCuándo
INVALID_CODE400El código no coincide o ya fue utilizado
CODE_EXPIRED400El código fue emitido hace más de 10 minutos
NOT_FOUND404No se encontró OTP pendiente para este identificador
VALIDATION_ERROR400El campo identifier o code está ausente o malformado

Flujo completo de onboarding

Después de una verificación exitosa, usa onboarding_stage para enrutar al usuario a la pantalla correcta:

onboarding_stageSiguiente paso
financial_intakeMostrar el formulario de intake financiero → POST /v1/users/:id/financial-intake
personalityMostrar el quiz de personalidad → GET /v1/personality/questions + POST /v1/personality/score
planMostrar la pantalla de generación del plan → POST /v1/users/:id/plan/generate, luego PATCH /v1/users/:id/onboarding/complete
activeEl usuario completó el onboarding — ir directamente a la pantalla principal de chat
tip

SESSION_SECRET y la gestión de cookies de sesión son responsabilidad de tu aplicación. Ozzie no emite tokens de sesión — solo valida el código OTP y devuelve los datos que tu aplicación necesita para inicializar su propia sesión.