
# Actualizar su perfil

`PATCH /fapi/v1/me` · llamado desde el host de inicio de sesión del entorno

Cambia los campos del perfil del usuario autenticado. Un campo presente en el cuerpo se modifica, un campo ausente se deja como está, y una cadena vacía o `null` borra el campo. `user_metadata`, si se indica, se fusiona como un parche de fusión RFC 7396. Se aplican las mismas reglas de campos que en la API de administración. Requiere la cookie `__Host-idp_session` del usuario autenticado; no es necesaria una reverificación reciente. Una aplicación de primera parte en otro origen puede enviar en su lugar su token de acceso de la API frontal (`Authorization: DPoP <token>` con una prueba DPoP; consulte [Token de acceso de la API frontal](/docs/api/fapi/front-api-token)).

Errores de campos (`422 validation_failed`, en `errors[]`): `invalid` (formato o longitud; `/locale` también cuando el idioma no está habilitado para el entorno), `too_large` y `too_many_keys` (`user_metadata` supera 16 KiB, profundidad 5 o 100 claves de nivel superior), `identifier_type_disabled` (los nombres de usuario están desactivados en el entorno), `profile_field_disabled` (el entorno desactivó el campo; aun así se permite borrarlo) y `profile_field_required` (el entorno exige el campo, por lo que no se puede borrar).

## Solicitud

Encabezados:

| Encabezado | Obligatorio | Descripción |
| --- | --- | --- |
| `Idp-Client` | sí | Identificador del SDK. |
| `Origin` | sí | Debe ser exactamente `https://<host de inicio de sesión>`. |
| `If-Match` | no | Opcional. El `ETag` de una respuesta anterior (o `*`); el cambio solo se realiza si el perfil sigue en esa versión. |

Cuerpo (`application/json` o `application/merge-patch+json`):

| Campo | Tipo | Descripción |
| --- | --- | --- |
| `given_name` | cadena o null | Nombre. |
| `family_name` | cadena o null | Apellidos. |
| `name` | cadena o null | Nombre completo. |
| `picture` | cadena o null | URL de la imagen (`https`). |
| `locale` | cadena o null | Idioma (etiqueta BCP 47). |
| `zoneinfo` | cadena o null | Zona horaria (nombre IANA). |
| `username` | cadena o null | Nombre de usuario. |
| `user_metadata` | objeto | Parche de fusión aplicado a `user_metadata` (RFC 7396). |

```json
{
  "given_name": "Ada",
  "zoneinfo": "",
  "user_metadata": {
    "theme": null
  }
}
```

## Respuesta

`200 OK` con el perfil actualizado (los mismos campos que `GET /fapi/v1/me`) y un nuevo `ETag`.

## Errores

| Estado | Código | Cuándo |
| --- | --- | --- |
| 400 | `malformed_request` | El cuerpo o el encabezado `If-Match` tiene un formato incorrecto. |
| 400 | `unknown_field` | El cuerpo contiene un campo que no se puede modificar aquí (por ejemplo, `email` o `app_metadata`). |
| 401 | `unauthenticated` | No hay una cookie de sesión válida. |
| 403 | `origin_not_allowed` | `Origin` falta o es incorrecto. |
| 404 | `not_found` | No se puede leer la cuenta (por ejemplo, está bloqueada o en proceso de eliminación). |
| 409 | `username_unavailable` | El nombre de usuario está reservado o ya lo usa otra cuenta (ambos casos reciben la misma respuesta). |
| 412 | `precondition_failed` | `If-Match` no coincide con la versión actual; no se cambió nada. |
| 413 | `payload_too_large` | El cuerpo supera 16 KiB. |
| 415 | `unsupported_media_type` | `Content-Type` no compatible. |
| 422 | `validation_failed` | Un campo incumple una regla; `errors[]` indica el campo y el motivo (véase arriba). |
| 503 | `service_unavailable` | El directorio de usuarios no está disponible temporalmente; reintente después de `Retry-After` segundos. |

## Ejemplo

```bash
curl -X PATCH https://example.keenauth.app/fapi/v1/me \
  -H "Idp-Client: my-app/1.0.0 (node/22.0.0)" \
  -H "Origin: https://example.keenauth.app" \
  -H 'If-Match: "7"' \
  -H "Content-Type: application/json" \
  -b cookies.txt \
  -d '{"given_name":"Ada","zoneinfo":""}'
```

## 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.
