Aller au contenu

Feedback (User Reports)

Deux endpoints publics, authentifiés par X-Pionne-Token. Utilisés par le SDK pour envoyer un commentaire libre laissé par un utilisateur final.

Feedback standalone — pas lié à un event. Utile pour les widgets généralistes (« Donner un avis »).

POST https://api.pionne.app/feedback
Content-Type: application/json
X-Pionne-Token: pio_live_…
{
"message": "La page de checkout reste blanche après le paiement",
"name": "Alice",
"email": "alice@example.com",
"url": "https://app.example.com/checkout",
"app_version": "1.4.2"
}

Exemple mobile avec deep link (cohérent avec ce que le SDK RN envoie automatiquement) :

POST https://pionne.agkgcreations.fr/api/feedback
Content-Type: application/json
X-Pionne-Token: pio_live_…
{
"message": "L'écran reste blanc après le tap sur Payer",
"url": "phaniste://Checkout",
"app_version": "1.4.2"
}

Feedback attaché à un event capturé. Le serveur valide que event_id appartient bien au projet identifié par le token, et lie automatiquement le feedback à l’issue_id correspondant.

POST https://pionne.agkgcreations.fr/api/events/1234/feedback
Content-Type: application/json
X-Pionne-Token: pio_live_…
{
"message": "Ça plante quand je tape un emoji dans le chat",
"email": "bob@example.com"
}
ChampTypeContraintes
message (req.)string1 à 2000 caractères. PII-scrubbé côté serveur (email, JWT, CB).
namestring120 caractères max.
emailstringEmail valide RFC, 191 caractères max.
urlstringIdentifiant de localisation contextuel. Accepte les URLs web (https://app.example.com/checkout) et les deep links mobile (myapp://Settings, phaniste://order/42). 500 caractères max. Stocké pour affichage seulement, jamais re-fetché.
app_versionstring32 caractères max.
202 Accepted
{ "ok": true, "feedback_id": 42 }
CodeCas
202Feedback enregistré.
401Token absent / invalide.
404event_id introuvable ou n’appartient pas au projet.
422Payload invalide (message vide, email malformé…).
429Rate limit dépassé (100/min/projet).

Le message est passé dans le PII scrubber serveur avant stockage : les emails, JWT et numéros de carte sont remplacés par [REDACTED]. Les champs name et email du formulaire sont conservés tels quels — ils ont été volontairement saisis par l’utilisateur.

L’IP source est hashée (SHA-256) avec APP_KEY en sel et stockée uniquement pour la déduplication anti-spam ; jamais sous forme claire.

Trois endpoints authentifiés Sanctum (utilisés par le dashboard mobile pour gérer les feedbacks reçus). Le projet doit appartenir au user authentifié.

Liste les feedbacks (jusqu’à 100, du plus récent au plus ancien). Par défaut les archived sont masqués ; passe ?include=all pour les ramener.

{
"feedback": [
{
"id": 7,
"event_id": 1234,
"issue_id": 88,
"name": "Alice",
"email": "alice@example.com",
"message": "Le bouton Pay reste grisé...",
"status": "open",
"handled_at": null,
"url": null,
"app_version": "1.4.2",
"created_at": "2026-05-07T17:25:00Z"
}
]
}

Change le statut d’un feedback (triage). Body :

{ "status": "open" | "handled" | "archived" }

handled_at est mis à now() si status passe à handled, sinon remis à null. Réponses : 200 (OK), 404 (introuvable / autre projet), 422 (statut invalide).

DELETE /api/projects/{project}/feedback/{feedback}

Section intitulée « DELETE /api/projects/{project}/feedback/{feedback} »

Suppression définitive. Réponses : 200 { "deleted": true } ou 404.

Aggrège les sessions de release health des 14 derniers jours par release et calcule le crash-free user rate. Réponse :

{
"releases": [
{
"release": "1.4.2",
"sessions_total": 1240,
"sessions_crashed": 3,
"sessions_errored": 17,
"users_total": 412,
"users_crashed": 2,
"crash_free_sessions": 0.9976,
"crash_free_users": 0.9951,
"first_seen_at": "2026-04-25T08:00:00Z",
"last_seen_at": "2026-05-07T17:30:00Z"
}
]
}

Les valeurs crash_free_* sont des ratios 0..1. Le dashboard mobile les colore en vert ≥ 0.99, jaune ≥ 0.95, rouge en dessous.