---
title: "QR code de profil"
description: "QR code stylisé (PNG) encodant l'URL de la page profil publique /@{username}, avec l'avatar de l'utilisateur en son centre. Donnée publique."
---

QR code stylisé (PNG) encodant l'URL de la page profil publique `/@{username}`, avec l'avatar de l'utilisateur en son centre. Donnée **publique**.

## `GET /qrcode/{username}.png`

- **Auth** : aucune (gating identique à la page profil : `404` si l'utilisateur n'existe pas, n'est pas confirmé, est banni ou supprimé).
- **Action** : [ShowUserProfileQrcodeAction](../src/Http/Action/Web/ShowUserProfileQrcodeAction.php)
- **Réponse `200 OK`** : `image/png`, `Cache-Control: public, max-age=86400`, `ETag` ; renvoie `304` sur `If-None-Match` concordant.
- **Génération** : à la volée puis mise en cache disque, la clé de cache embarquant la version de l'avatar — remplacer/supprimer l'avatar régénère le QR.

## Attribut `qrcodeUrl`

L'URL de ce QR code est exposée comme attribut **public** `qrcodeUrl` sur **toutes** les API qui renvoient un utilisateur :

- ressource JSON:API `users` (`/api/auth/me`, `/api/auth/login`, `/api/auth/register`, `/api/users/*`, …),
- bloc public [`author`](#auteur-public-author-sur-la-ressource-medias) inliné sur les ressources `medias`,
- back-office (`GET /admin/users`, `GET /admin/users/{hex}`).

Format : `{APP_URL}/qrcode/{username}.png`. Un cache-buster `?v=<timestamp>` (issu de `avatar_updated_at`) n'est ajouté que si l'utilisateur a un avatar.

---
