Cambiar el correo
Cambiar el correo de la cuenta con contraseña, código al correo nuevo y una prueba extra.
El correo es la llave de recuperación de la cuenta, así que no se cambia como un campo más. El titular lo pide, demuestra que es él y el cambio se hace 48 horas después. Mientras tanto los retiros, envíos, compras con saldo y ventas P2P quedan pausados, y avisamos al correo actual, a Telegram y por notificación.
Solo sirve con una sesión de inicio de sesión. Un token de API acotado recibe 403.
GET /user/update/email
Devuelve el estado para pintar la pantalla.
{
"enabled": true,
"can_start": true,
"problem": null,
"methods": ["totp", "telegram"],
"hold_hours": 48,
"pending": null
}| Campo | Descripción |
|---|---|
enabled | Si es false, el cambio no está disponible para tu cuenta y no llega nada más |
can_start | Si puedes pedir el cambio ahora |
problem | { code, message, until } cuando no puedes. until es la fecha a partir de la cual podrás |
methods | Pruebas que acepta tu cuenta: totp, telegram o old_email |
pending | El cambio en curso: { uuid, new_email, execute_after, requested_at, cancel_methods }. El correo viene enmascarado |
Qué prueba pide cada cuenta
| Situación | Prueba |
|---|---|
| Tiene app autenticadora o Telegram | totp (código de 6 dígitos o de recuperación) o telegram. Es obligatoria: el PIN por correo no vale |
| No tiene ninguno | old_email: un código al correo actual |
| No tiene ninguno y en los últimos 14 días cambió la contraseña por correo, restableció el 2FA, pulsó «No fui yo» o quitó un factor | No puede hacerlo por su cuenta: EMAIL_CHANGE_QUIET_PERIOD con until |
Un factor activado hace menos de 14 días no sirve de prueba.
POST /user/update/email
Todas las operaciones usan esta ruta y se distinguen por action.
1. Empezar
curl -X POST https://api.qvapay.com/user/update/email \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{ "action": "start", "new_email": "[email protected]", "password": "..." }'Manda un código de 6 dígitos al correo nuevo y, en cuentas sin factor, otro al correo actual. Los códigos caducan a los 15 minutos.
{ "ok": true, "new_email": "nu***@e***.com", "methods": ["totp", "telegram"] }2. Pedir el código por Telegram
Solo si vas a usar la prueba telegram.
{ "action": "send_code", "channel": "telegram" }3. Confirmar
Abre el pedido y pausa el dinero. Responde 201.
{ "action": "confirm", "new_email_code": "123456", "proof": { "type": "totp", "code": "654321" } }{ "ok": true, "pending": { "uuid": "…", "new_email": "nu***@e***.com", "execute_after": "2026-11-08T20:00:00.000Z" } }Tras 5 códigos incorrectos hay que empezar de nuevo.
Cancelar
Cancelar con sesión exige la misma prueba que pedirlo, y no congela la cuenta. Sin factor, pide primero el código con { "action": "send_code", "channel": "old_email", "purpose": "cancel" }. Con Telegram, usa "channel": "telegram" y el mismo purpose.
{ "action": "cancel", "proof": { "type": "totp", "code": "654321" } }Cuando el cambio se hace
Pasadas las 48 horas el correo cambia. Se cierran todas las sesiones, se anula el PIN y cualquier restablecimiento en curso, y los tickets abiertos pasan al correo nuevo. Los tokens de API acotados siguen funcionando, y las cuentas con PIN fijo lo conservan.
El correo anterior queda reservado: nadie puede registrarse con él ni recibir envíos en él. Solo puedes hacer un cambio cada 30 días.
«No fui yo»
El aviso al correo actual trae un enlace para cancelar el cambio. El botón de esa página también congela la cuenta y cierra todas las sesiones, igual que «No fui yo» en Telegram o en la web. Para reactivarla hay que hablar con soporte.
Errores
| Código | HTTP | Significado |
|---|---|---|
SESSION_REQUIRED | 403 | Hace falta una sesión de inicio de sesión |
EMAIL_CHANGE_DISABLED | 403 | No disponible para esta cuenta |
EMAIL_CHANGE_PENDING | 409 | Ya hay un cambio en curso |
EMAIL_CHANGE_HOLD | 409 | Hay una pausa de seguridad activa |
EMAIL_CHANGE_TOO_SOON | 409 | Ya hubo un cambio en los últimos 30 días |
EMAIL_CHANGE_QUIET_PERIOD | 409 | Hubo un cambio de seguridad reciente |
PASSWORD_INVALID | 422 | Contraseña incorrecta |
EMAIL_SAME | 400 | Ese ya es tu correo |
EMAIL_INVALID | 400 | Correo desechable o que no recibe mensajes |
EMAIL_TAKEN | 409 | Ese correo no está disponible |
NEW_EMAIL_CODE_INVALID | 422 | Código del correo nuevo incorrecto |
PROOF_INVALID | 422 | Prueba incorrecta |
PROOF_NOT_ALLOWED | 400 | Esa prueba no vale para esta cuenta |
EMAIL_CHANGE_EXPIRED | 410 | La solicitud caducó |
TOO_MANY_ATTEMPTS | 429 | Demasiados intentos |
CODE_LOCKED | 423 | Demasiados códigos incorrectos en la cuenta |
EMAIL_CHANGE_UNAVAILABLE | 503 | No se pudo registrar el pedido. El correo no cambió |