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:
- Paso 1: Enviar email para iniciar registro
- Paso 2: Verificar código de 6 dígitos enviado por email
- Paso 3: Establecer contraseña y completar registro
Paso 1: Iniciar Registro
/auth/registerEnvía código de verificación de 6 dígitos al email proporcionado para iniciar el proceso de registro
📋 Parámetros
emailstringrequeridoDirecció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
/auth/register/verify?token={token}Verifica el código de 6 dígitos enviado por email
📋 Parámetros
tokenstringrequeridoToken de sesión obtenido en el Paso 1
codestringrequeridoCó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
/auth/register?token={token}Establece la contraseña y completa el registro. Incluye auto-autorización del dispositivo para login directo.
📋 Parámetros
tokenstringrequeridoToken de sesión verificado del Paso 2
passwordstringrequeridoContraseñ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.