QvaPay API
User

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
}
CampoDescripción
enabledSi es false, el cambio no está disponible para tu cuenta y no llega nada más
can_startSi puedes pedir el cambio ahora
problem{ code, message, until } cuando no puedes. until es la fecha a partir de la cual podrás
methodsPruebas que acepta tu cuenta: totp, telegram o old_email
pendingEl cambio en curso: { uuid, new_email, execute_after, requested_at, cancel_methods }. El correo viene enmascarado

Qué prueba pide cada cuenta

SituaciónPrueba
Tiene app autenticadora o Telegramtotp (código de 6 dígitos o de recuperación) o telegram. Es obligatoria: el PIN por correo no vale
No tiene ningunoold_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 factorNo 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ódigoHTTPSignificado
SESSION_REQUIRED403Hace falta una sesión de inicio de sesión
EMAIL_CHANGE_DISABLED403No disponible para esta cuenta
EMAIL_CHANGE_PENDING409Ya hay un cambio en curso
EMAIL_CHANGE_HOLD409Hay una pausa de seguridad activa
EMAIL_CHANGE_TOO_SOON409Ya hubo un cambio en los últimos 30 días
EMAIL_CHANGE_QUIET_PERIOD409Hubo un cambio de seguridad reciente
PASSWORD_INVALID422Contraseña incorrecta
EMAIL_SAME400Ese ya es tu correo
EMAIL_INVALID400Correo desechable o que no recibe mensajes
EMAIL_TAKEN409Ese correo no está disponible
NEW_EMAIL_CODE_INVALID422Código del correo nuevo incorrecto
PROOF_INVALID422Prueba incorrecta
PROOF_NOT_ALLOWED400Esa prueba no vale para esta cuenta
EMAIL_CHANGE_EXPIRED410La solicitud caducó
TOO_MANY_ATTEMPTS429Demasiados intentos
CODE_LOCKED423Demasiados códigos incorrectos en la cuenta
EMAIL_CHANGE_UNAVAILABLE503No se pudo registrar el pedido. El correo no cambió