
# Convertir una dirección de correo electrónico verificada en la dirección principal del usuario

`POST /v1/users/{user_id}/emails/{email_id}:set-primary` · permiso `users:write`

Convierte una dirección verificada en la dirección principal del usuario; la principal anterior pasa a ser una dirección secundaria. Una dirección no verificada no puede convertirse en principal. Si la dirección ya es principal, no se escribe nada y se devuelve `200`. El cambio se registra en el registro de auditoría de gestión como `user.primary_email_changed`, con la clave de API como actor, y emite `user.updated`.

## Solicitud

| Parámetro | En | Obligatorio | Descripción |
|---|---|---|---|
| `user_id` | ruta | sí | Id del usuario, con el prefijo `usr_`. |
| `email_id` | ruta | sí | Id de la fila de correo electrónico (UUID interno, en minúsculas y con guiones), tal como lo devuelve `GET /v1/users/{user_id}/emails`. |

La solicitud no admite cuerpo (se acepta un cuerpo vacío o `{}`).

## Respuesta

`200 OK` con la fila de correo electrónico actualizada. Sin el permiso `users:read_pii`, la dirección aparece enmascarada (`a***@e***.com`).

```json
{
  "id": "0191f0a0-3333-7444-8555-666666666666",
  "email": "ada@example.com",
  "verified": true,
  "primary": true,
  "created_at": "2026-01-15T09:30:00Z"
}
```

## Errores

Cada error es un cuerpo `application/problem+json` con un `code` estable.

| HTTP | `code` | Cuándo |
|---|---|---|
| 400 | `malformed_request`, `unknown_field` | El cuerpo no es JSON válido, o no está vacío ni es `{}`. |
| 409 | `primary_requires_verified` | La dirección no está verificada. |
| 404 | `not_found` | El usuario o la fila de correo electrónico no existe en este entorno, el correo no pertenece a este usuario, o un id tiene un formato incorrecto. |
| 401 | `unauthenticated` | Falta la clave de API, no es válida o ha sido revocada. |
| 403 | `insufficient_permissions` | La clave no tiene el permiso `users:write`. |
| 429 | `rate_limited` | Se superó el límite de frecuencia; respete `Retry-After`. |
| 503 | `service_unavailable` | Una dependencia no está disponible temporalmente; vuelva a intentarlo más tarde. |

## Ejemplo

```bash
curl -X POST https://api.eu.keenauth.com/v1/users/usr_0a1b2c3d4e5f6g7h8j9k0m1n2p/emails/0191f0a0-3333-7444-8555-666666666666:set-primary \
  -H "Authorization: Bearer $KEENAUTH_SECRET_KEY"
```

## Datos personales

Este endpoint contiene datos personales: perfil del usuario final. [Datos personales en las API de KeenAuth](/docs/policies/personal-data) describe qué se almacena, cuánto tiempo se conserva y cómo se elimina. No envíe categorías especiales de datos personales (salud, datos biométricos, religión, opiniones políticas, orientación sexual) en ningún campo.
