Skip to main content

Registro de Usuario (v1)

Proceso de registro en 3 pasos: envío de email, verificación de código y establecimiento de contraseña. Incluye auto-autorización de dispositivo para login inmediato después del registro.


Flujo de Registro Completo

El registro v1 consta de 3 pasos separados:

  1. Paso 1: Enviar email para iniciar registro
  2. Paso 2: Verificar código de 6 dígitos enviado por email
  3. Paso 3: Establecer contraseña y completar registro

Paso 1: Iniciar Registro

POST/auth/register

Envía código de verificación de 6 dígitos al email proporcionado para iniciar el proceso de registro

📋 Parámetros

emailstringrequerido

Dirección de correo electrónico del nuevo usuario

📤 Respuesta

{
"code": 1010,
"message": "Verification code sent successfully",
"data": {
  "token": "550e8400-e29b-41d4-a716-446655440000"
}
}

Validaciones

  • El email debe tener formato válido: usuario@dominio.com
  • No debe estar previamente registrado en el sistema
  • Cumplir con regex: /^[^\s@]+@[^\s@]+\.[^\s@]+$/

Respuestas

Respuesta Exitosa

Código 1010 - Código de verificación enviado exitosamente al email.

{
"code": 1010,
"message": "Verification code sent successfully",
"data": {
"token": "550e8400-e29b-41d4-a716-446655440000"
}
}

Comportamiento del sistema:

  • Se genera un token UUID único de sesión
  • Se envía código de 6 dígitos al email
  • Token y código válidos por 10 minutos
  • Si ya existe una sesión válida para ese email, se reutiliza

Datos Faltantes

Código 4006 - Faltan campos requeridos.

{
"code": 4006,
"message": "Missing required data"
}

Email Ya Registrado

Código 4002 - El email ya está registrado en el sistema.

{
"code": 4002,
"message": "The email is already registered"
}

Ejemplo de Uso

JavaScript/TypeScript

const startRegistration = async (email) => {
try {
const response = await fetch('https://api.swapbits.co/auth/register', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ email })
});

const result = await response.json();

if (result.code === 1010) {
console.log('Código enviado al email');
sessionStorage.setItem('registrationToken', result.data.token);
window.location.href = `/verify-email?token=${result.data.token}`;
return { success: true, token: result.data.token };
} else if (result.code === 4002) {
console.error('El email ya está registrado');
return { success: false, error: 'EMAIL_EXISTS' };
}
} catch (error) {
console.error('Error en registro:', error);
return { success: false, error: error.message };
}
};

startRegistration('nuevo@ejemplo.com');

Python

import requests

def start_registration(email: str) -> dict:
"""Iniciar proceso de registro"""
url = 'https://api.swapbits.co/auth/register'
data = {'email': email}

try:
response = requests.post(url, json=data, timeout=10)
result = response.json()

if result['code'] == 1010:
print(f"Código enviado a {email}")
return {
'success': True,
'token': result['data']['token'],
'message': 'Revisa tu email para el código de verificación'
}
elif result['code'] == 4002:
return {'success': False, 'error': 'EMAIL_EXISTS'}
else:
return {'success': False, 'error': result['message']}
except requests.exceptions.RequestException as e:
return {'success': False, 'error': str(e)}

result = start_registration('nuevo@ejemplo.com')

cURL

curl -X POST 'https://api.swapbits.co/auth/register' \
-H 'Content-Type: application/json' \
-d '{
"email": "nuevo@ejemplo.com"
}'

Paso 2: Verificar Código

POST/auth/register/verify?token={token}

Verifica el código de 6 dígitos enviado por email

📋 Parámetros

tokenstringrequerido

Token de sesión obtenido en el Paso 1

codestringrequerido

Código de 6 dígitos recibido por email

📤 Respuesta

{
"code": 3001,
"message": "Email verified successfully",
"data": null
}

Validaciones

  • El código debe ser exactamente 6 dígitos numéricos
  • El token debe ser válido y no expirado (10 minutos)
  • Cumplir con regex: /^\\d{6}$/

Respuestas

Verificación Exitosa

Código 3001 - Email verificado correctamente.

{
"code": 3001,
"message": "Email verified successfully",
"data": null
}

Después de esta respuesta, el usuario puede proceder al Paso 3.

Datos Faltantes

Código 4006 - Faltan campos requeridos.

{
"code": 4006,
"message": "Missing required data"
}

Token Inválido

Código 4015 - Token de sesión inválido o expirado.

{
"code": 4015,
"message": "Invalid session token"
}

Código Inválido

Código 4005 - El código de verificación no coincide.

{
"code": 4005,
"message": "Invalid verification code"
}

Token de Verificación Inválido

Código 4004 - El token de verificación no es válido.

{
"code": 4004,
"message": "The verification token is invalid"
}

Ejemplo de Uso

JavaScript/TypeScript

const verifyEmailCode = async (token, code) => {
try {
const response = await fetch(`https://api.swapbits.co/auth/register/verify?token=${token}`, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ code })
});

const result = await response.json();

if (result.code === 3001) {
console.log('Email verificado correctamente');
return { success: true };
} else if (result.code === 4005) {
console.error('Código incorrecto');
return { success: false, error: 'INVALID_CODE' };
} else if (result.code === 4015) {
console.error('Token expirado o inválido');
return { success: false, error: 'INVALID_TOKEN' };
}
} catch (error) {
console.error('Error verificando código:', error);
return { success: false, error: error.message };
}
};

const token = sessionStorage.getItem('registrationToken');
verifyEmailCode(token, '123456');

Python

def verify_email_code(token: str, code: str) -> dict:
"""Verificar código de email"""
url = f'https://api.swapbits.co/auth/register/verify?token={token}'
data = {'code': code}

try:
response = requests.post(url, json=data, timeout=10)
result = response.json()

if result['code'] == 3001:
return {'success': True}
elif result['code'] == 4005:
return {'success': False, 'error': 'INVALID_CODE'}
elif result['code'] == 4015:
return {'success': False, 'error': 'INVALID_TOKEN'}
else:
return {'success': False, 'error': result['message']}
except requests.exceptions.RequestException as e:
return {'success': False, 'error': str(e)}

verify_email_code('token-from-step-1', '123456')

cURL

curl -X POST 'https://api.swapbits.co/auth/register/verify?token=550e8400-e29b-41d4-a716-446655440000' \
-H 'Content-Type: application/json' \
-d '{
"code": "123456"
}'

Paso 3: Completar Registro

POST/auth/register?token={token}

Establece la contraseña y completa el registro. Incluye auto-autorización del dispositivo para login directo.

📋 Parámetros

tokenstringrequerido

Token de sesión verificado del Paso 2

passwordstringrequerido

Contraseña del usuario que debe cumplir requisitos de seguridad

📤 Respuesta

{
"code": 1000,
"message": "Registration completed successfully",
"data": null
}

Requisitos de Contraseña

La contraseña debe cumplir todos los siguientes requisitos:

  • Mínimo 9 caracteres
  • Al menos una letra minúscula (a-z)
  • Al menos una letra mayúscula (A-Z)
  • Al menos un dígito (0-9)
  • Al menos un carácter especial (!@#$%^&*()_+-=[]|;:',.<>?/)

Regex de validación: /^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[\\W_]).{9,}$/

Características Importantes

Auto-Autorización de Dispositivo

El sistema automáticamente:

  • Captura la IP y User-Agent del dispositivo de registro
  • Consulta la geolocalización (país y región) del IP
  • Crea una sesión confiable inmediata para ese dispositivo
  • Permite login directo sin verificación de email en el primer inicio de sesión

Inicialización de Usuario

Al completar el registro, se crean:

  • Wallets para 24 criptomonedas diferentes (BTC, ETH, USDT, etc.)
  • Claves privadas para redes: BTC, EVM, TRON, SOL
  • Configuración de seguridad inicial (2FA deshabilitado, PIN no configurado)
  • Registro KYC en estado NO_INICIADO
  • Email de bienvenida

Respuestas

Registro Completado

Código 1000 - Usuario registrado exitosamente.

{
"code": 1000,
"message": "Registration completed successfully",
"data": null
}

Acciones del sistema:

  • Usuario creado en base de datos
  • Wallets inicializadas
  • Dispositivo auto-autorizado
  • Email de bienvenida enviado
  • Contador mensual de registros incrementado

Datos Faltantes

Código 4006 - Faltan campos requeridos.

{
"code": 4006,
"message": "Missing required data"
}

Contraseña Inválida

Código 4008 - La contraseña no cumple los requisitos de seguridad.

{
"code": 4008,
"message": "The provided password does not meet the required criteria"
}

Token Inválido

Código 4015 - Token de sesión inválido o expirado.

{
"code": 4015,
"message": "Invalid session token"
}

Email No Verificado

Código 4005 - El email no fue verificado en el Paso 2.

{
"code": 4005,
"message": "Invalid verification code"
}

Error del Servidor

Código 5001 - Error al guardar usuario en base de datos.

{
"code": 5001,
"message": "Failed to save user to the database"
}

Ejemplo de Uso

JavaScript/TypeScript

const completeRegistration = async (token, password) => {
try {
const response = await fetch(`https://api.swapbits.co/auth/register?token=${token}`, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ password })
});

const result = await response.json();

if (result.code === 1000) {
console.log('Registro completado exitosamente');
sessionStorage.removeItem('registrationToken');
window.location.href = '/login';
return { success: true };
} else if (result.code === 4008) {
console.error('Contraseña no cumple requisitos de seguridad');
return {
success: false,
error: 'PASSWORD_REQUIREMENTS',
message: 'La contraseña debe tener al menos 9 caracteres, mayúsculas, minúsculas, números y símbolos'
};
} else if (result.code === 4015) {
console.error('Token expirado');
return {
success: false,
error: 'TOKEN_EXPIRED',
message: 'Tu sesión ha expirado, por favor inicia el registro nuevamente'
};
}
} catch (error) {
console.error('Error completando registro:', error);
return { success: false, error: error.message };
}
};

// Validación de contraseña en el frontend
const validatePassword = (password) => {
const regex = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[\W_]).{9,}$/;
return regex.test(password);
};

const token = sessionStorage.getItem('registrationToken');
const password = 'MiPassword123!';

if (validatePassword(password)) {
completeRegistration(token, password);
} else {
console.error('Contraseña no válida');
}

Python

import re

def validate_password(password: str) -> bool:
"""Validar que la contraseña cumpla requisitos"""
regex = r'^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[\W_]).{9,}$'
return bool(re.match(regex, password))

def complete_registration(token: str, password: str) -> dict:
"""Completar registro con contraseña"""
if not validate_password(password):
return {
'success': False,
'error': 'PASSWORD_REQUIREMENTS',
'message': 'La contraseña no cumple los requisitos de seguridad'
}

url = f'https://api.swapbits.co/auth/register?token={token}'
data = {'password': password}

try:
response = requests.post(url, json=data, timeout=10)
result = response.json()

if result['code'] == 1000:
return {'success': True}
elif result['code'] == 4008:
return {'success': False, 'error': 'PASSWORD_REQUIREMENTS'}
elif result['code'] == 4015:
return {'success': False, 'error': 'TOKEN_EXPIRED'}
else:
return {'success': False, 'error': result['message']}
except requests.exceptions.RequestException as e:
return {'success': False, 'error': str(e)}

complete_registration('token-from-step-2', 'MiPassword123!')

cURL

curl -X POST 'https://api.swapbits.co/auth/register?token=550e8400-e29b-41d4-a716-446655440000' \
-H 'Content-Type: application/json' \
-d '{
"password": "MiPassword123!"
}'

¿No Recibiste el Código?

Si el código de verificación no llegó a tu email o expiró, puedes solicitar un nuevo código.

Reenvío de Código de Verificación

Para solicitar un nuevo código de verificación durante el proceso de registro, consulta la documentación completa:

👉 Reenvío de Código de Verificación

Características:

  • Sistema de cooldown de 30 segundos
  • Nuevo código válido por 5 minutos
  • Invalidación automática del código anterior

Notas Importantes

Consideraciones de Seguridad

  • Todos los tokens expiran en 10 minutos por seguridad
  • Los códigos son de un solo uso
  • Las contraseñas se hashean con bcrypt antes de almacenarse
  • El sistema implementa cooldown de 30 segundos en reenvíos para prevenir spam
  • Las claves privadas de wallets se generan de forma segura y se almacenan encriptadas

Alternativa: Registro v2

Si prefieres un proceso más simple, revisa el Registro v2 que combina email y contraseña en un solo paso inicial.


Enlaces Relacionados