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.
POST /api/feedback
Section intitulée « POST /api/feedback »Feedback standalone — pas lié à un event. Utile pour les widgets généralistes (« Donner un avis »).
POST https://api.pionne.app/feedbackContent-Type: application/jsonX-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/feedbackContent-Type: application/jsonX-Pionne-Token: pio_live_…
{ "message": "L'écran reste blanc après le tap sur Payer", "url": "phaniste://Checkout", "app_version": "1.4.2"}POST /api/events/{event_id}/feedback
Section intitulée « POST /api/events/{event_id}/feedback »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/feedbackContent-Type: application/jsonX-Pionne-Token: pio_live_…
{ "message": "Ça plante quand je tape un emoji dans le chat", "email": "bob@example.com"}| Champ | Type | Contraintes |
|---|---|---|
message (req.) | string | 1 à 2000 caractères. PII-scrubbé côté serveur (email, JWT, CB). |
name | string | 120 caractères max. |
email | string | Email valide RFC, 191 caractères max. |
url | string | Identifiant 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_version | string | 32 caractères max. |
Réponses
Section intitulée « Réponses »202 Accepted{ "ok": true, "feedback_id": 42 }| Code | Cas |
|---|---|
202 | Feedback enregistré. |
401 | Token absent / invalide. |
404 | event_id introuvable ou n’appartient pas au projet. |
422 | Payload invalide (message vide, email malformé…). |
429 | Rate limit dépassé (100/min/projet). |
Vie privée
Section intitulée « Vie privée »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.
Triage côté dashboard
Section intitulée « Triage côté dashboard »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é.
GET /api/projects/{project}/feedback
Section intitulée « GET /api/projects/{project}/feedback »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" } ]}PATCH /api/projects/{project}/feedback/{feedback}
Section intitulée « PATCH /api/projects/{project}/feedback/{feedback} »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.
Release Health côté dashboard
Section intitulée « Release Health côté dashboard »GET /api/projects/{project}/release-health
Section intitulée « GET /api/projects/{project}/release-health »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.