Galet
Référence

API Galet

Les routes publiques de Galet, générées depuis le code.

Les routes publiques de Galet. La collecte s'authentifie par la clé du canal ; la lecture par un jeton Authorization: Bearer. Les erreurs ont la forme { error, code }.

Pour essayer les routes depuis le navigateur, ouvrez la référence interactive. La spécification OpenAPI complète est publiée sur /openapi.json : importez-la dans Postman, Insomnia ou un générateur de client.

POST /v1/reports

Envoyer un retour depuis un serveur.

Crée un retour sur le canal API d'une app. À appeler depuis un serveur, jamais depuis un navigateur : quiconque connaît la clé peut envoyer des retours sur ce canal. Les URL autorisées de l'app ne s'appliquent pas à ce canal. Ni capture, ni replay, ni conversation : les champs inconnus sont ignorés. Le quota de feedbacks du plan s'applique. POST /v1/ingest, l'ancien nom de cette route, reste accepté.

Paramètres

NomOùRequisDescription
idempotency-keyen-têtenonFacultatif. Une valeur unique par retour (un UUID, par exemple). Une nouvelle tentative avec la même clé et le même corps renvoie la première réponse au lieu de créer un doublon, pendant 24 heures. La réponse rejouée porte l'en-tête Idempotent-Replayed: true.

Corps

ChampTypeRequisDescription
publicKeystringouiClé du canal API de l'app.
messagestringouiLe texte du retour, 10000 caractères au plus.
kindproblem, idea, praise, issue, bug, greetingouiType du retour : problem, idea ou praise. issue, bug et greeting sont acceptés pour compatibilité.
titlestringnonUn titre ; sinon Galet AI le rédige.
observedstringnonCe qui s'est passé.
expectedstringnonCe qui était attendu.
urlstringnonL'adresse concernée, gardée comme contexte.
userobjectnonLa personne qui a écrit.
user.idstringnonIdentifiant dans votre app.
user.emailstringnonIgnoré s'il n'a pas la forme d'un e-mail.
user.namestringnonNom affiché.
qualifybooleannontrue : Galet AI pose d'abord les questions qui manquent (voir POST /v1/reports/{id}/answers). Le retour est enregistré quand il est assez précis.
curl -X POST https://api.galet.dev/v1/reports \
  -H "Content-Type: application/json" \
  -d '{
    "publicKey": "pk_live_3f9c…",
    "message": "Export CSV vide",
    "kind": "problem",
    "url": "https://app.acme.com/exports",
    "user": {
      "email": "lea@acme.com"
    }
  }'

Réponses

Code HTTPDescription
200Avec qualify : une question à poser, ou la fin sans enregistrement.
201Retour créé. Avec qualify, quand il était déjà assez précis, la réponse porte aussi id et status: "ready".
400invalid_json : corps illisible. invalid_ingest : champ manquant ou invalide. invalid_idempotency_key : clé vide ou trop longue.
403channel_mismatch : la clé n'est ni celle d'un canal API ni celle d'un formulaire. channel_inactive : canal désactivé.
404unknown_app : clé inconnue.
409idempotency_in_progress : une requête avec la même Idempotency-Key est encore en cours.
413message_too_long : message trop long. payload_too_large : corps de plus de 256 Ko.
422idempotency_key_reused : la même Idempotency-Key a servi pour un autre corps.
429rate_limited : plus de 120 requêtes par minute depuis la même adresse IP.
502qualification_failed : Galet AI n'a pas répondu ; renvoyez le retour sans qualify.

Corps de la réponse 200 :

ChampTypeToujours présentDescription
idstringouiIdentifiant de la qualification, valable 15 minutes après la dernière réponse.
statusask, answer, drop, restart, resolvedouiask : répondre à questions. answer : Galet AI répond depuis le centre d'aide ; questions demande si la réponse suffit, et sinon la qualification continue. resolved : la réponse a suffi, rien n'est enregistré. drop : hors sujet, rien n'est enregistré. restart : la personne a changé de sujet ; rien n'est enregistré, recommencez avec un nouveau retour.
questionsobjet[]non
questions[].idstringoui
questions[].promptstringouiLa question, à afficher telle quelle.
questions[].modetext, single, multi, yes_no, scaleouitext : réponse libre. single, yes_no, scale : un choix. multi : un ou plusieurs choix.
questions[].choicesobject[]non
questions[].choices[].idstringoui
questions[].choices[].labelstringoui
questions[].allowTextFallbackbooleannonUne réponse libre est aussi acceptée.
sourceobjectnonanswer : la page d'aide d'où vient la réponse.
source.titlestringoui
source.urlstringoui
messagestringnondrop, restart et resolved : le message à afficher.

Corps de la réponse 201 :

ChampTypeToujours présentDescription
oktrueoui
ticketIdstringouiIdentifiant du feedback créé.
mergedbooleanouifalse à la création : le regroupement avec un feedback existant a lieu ensuite, en arrière-plan.
statusIdstringnonIdentifiant de suivi du retour.
statusTokenstringnonJeton qui donne accès à la page de suivi.
statusUrlstringnonPage de suivi du retour, à transmettre à la personne qui a écrit.
idstringnonIdentifiant de la qualification.
statusreadynon

POST /v1/reports/{id}/answers

Répondre à une question de qualification.

Envoie la réponse de la personne à la question en attente. La réponse est soit la question suivante (200), soit le retour enregistré (201).

Paramètres

NomOùRequisDescription
idcheminouiL'id renvoyé par l'étape précédente.

Corps

ChampTypeRequisDescription
publicKeystringouiLa clé utilisée pour créer le retour.
textstringnonRéponse libre.
choiceIdsstring[]nonIdentifiants des choix retenus parmi questions[].choices.
curl -X POST https://api.galet.dev/v1/reports/{id}/answers \
  -H "Content-Type: application/json" \
  -d '{
    "publicKey": "…"
  }'

Réponses

Code HTTPDescription
200Question suivante, ou fin sans enregistrement.
201Retour qualifié et enregistré.
400invalid_json, invalid_answer : corps invalide. missing_answer : ni text ni choiceIds.
404qualification_not_found : identifiant inconnu, autre clé, ou qualification expirée.
429rate_limited : trop de requêtes.
502qualification_failed : Galet AI n'a pas répondu.

Corps de la réponse 200 :

ChampTypeToujours présentDescription
idstringouiIdentifiant de la qualification, valable 15 minutes après la dernière réponse.
statusask, answer, drop, restart, resolvedouiask : répondre à questions. answer : Galet AI répond depuis le centre d'aide ; questions demande si la réponse suffit, et sinon la qualification continue. resolved : la réponse a suffi, rien n'est enregistré. drop : hors sujet, rien n'est enregistré. restart : la personne a changé de sujet ; rien n'est enregistré, recommencez avec un nouveau retour.
questionsobjet[]non
questions[].idstringoui
questions[].promptstringouiLa question, à afficher telle quelle.
questions[].modetext, single, multi, yes_no, scaleouitext : réponse libre. single, yes_no, scale : un choix. multi : un ou plusieurs choix.
questions[].choicesobject[]non
questions[].choices[].idstringoui
questions[].choices[].labelstringoui
questions[].allowTextFallbackbooleannonUne réponse libre est aussi acceptée.
sourceobjectnonanswer : la page d'aide d'où vient la réponse.
source.titlestringoui
source.urlstringoui
messagestringnondrop, restart et resolved : le message à afficher.

Corps de la réponse 201 :

ChampTypeToujours présentDescription
oktrueoui
ticketIdstringouiIdentifiant du feedback créé.
mergedbooleanouifalse à la création : le regroupement avec un feedback existant a lieu ensuite, en arrière-plan.
statusIdstringnonIdentifiant de suivi du retour.
statusTokenstringnonJeton qui donne accès à la page de suivi.
statusUrlstringnonPage de suivi du retour, à transmettre à la personne qui a écrit.
idstringouiIdentifiant de la qualification.
statusreadyoui

GET /v1/feedbacks

Lister les feedbacks.

Les feedbacks de l'organisation, du plus récent au plus ancien, filtrés côté serveur et paginés par curseur.

Paramètres

NomOùRequisDescription
statusrequêtenonopen (défaut), closed, all ou un statut précis.
kindrequêtenonproblem, idea, praise
severityrequêtenonP0, P1, P2, P3
appIdrequêtenonstring
featureIdrequêtenonstring
queryrequêtenonTexte cherché dans la clé, le titre, le résumé et les retours.
limitrequêtenon20 par défaut, 100 au plus.
cursorrequêtenonLe nextCursor de la page précédente.
curl https://api.galet.dev/v1/feedbacks \
  -H "Authorization: Bearer $GALET_TOKEN"

Réponses

Code HTTPDescription
200Une page.
400invalid_query : filtre inconnu ou invalide. invalid_cursor : curseur illisible.
401unauthorized : jeton absent. invalid_token : jeton inconnu, expiré ou révoqué.
403insufficient_scope : le jeton n'a pas le scope feedbacks:read.

Corps de la réponse 200 :

ChampTypeToujours présentDescription
dataobjet[]oui
data[].keystringouiClé lisible.
data[].idstringoui
data[].titlestringoui
data[].kindproblem, idea, praiseoui
data[].severityP0, P1, P2, P3non
data[].statustriage, prioritized, in_development, fixed, delivered, dismissedoui
data[].appobjectoui
data[].app.idstringoui
data[].app.namestringnon
data[].featureobjectnonLa fonctionnalité rattachée, avec son chemin dans la carte.
data[].feature.idstringoui
data[].feature.pathstringoui
data[].reportsintegerouiNombre de retours regroupés.
data[].createdAtstringouiISO 8601.
data[].lastActivityAtstringouiDernier retour reçu, ISO 8601.
data[].trackerIssuestringnonClé du ticket Jira ou Linear lié.
data[].urlstringouiLe feedback dans Galet.
nextCursorstring | nullouiÀ passer en cursor pour la page suivante ; null à la dernière.

GET /v1/feedbacks/{key}

Lire un feedback.

Un feedback, ses retours et, avec Silex, le contexte complet pour le corriger.

Paramètres

NomOùRequisDescription
keycheminouiClé lisible (FIF-12) ou identifiant.
curl https://api.galet.dev/v1/feedbacks/:key \
  -H "Authorization: Bearer $GALET_TOKEN"

Réponses

Code HTTPDescription
200Le feedback.
401unauthorized : jeton absent. invalid_token : jeton inconnu, expiré ou révoqué.
403insufficient_scope : le jeton n'a pas le scope feedbacks:read.
404not_found : aucun feedback avec cette clé dans l'organisation.

Corps de la réponse 200 :

ChampTypeToujours présentDescription
keystringouiClé lisible.
idstringoui
titlestringoui
kindproblem, idea, praiseoui
severityP0, P1, P2, P3non
statustriage, prioritized, in_development, fixed, delivered, dismissedoui
appobjectoui
app.idstringoui
app.namestringnon
featureobjectnonLa fonctionnalité rattachée, avec son chemin dans la carte.
feature.idstringoui
feature.pathstringoui
reportsintegerouiNombre de retours regroupés.
createdAtstringouiISO 8601.
lastActivityAtstringouiDernier retour reçu, ISO 8601.
urlstringouiLe feedback dans Galet.
naturestringnon
summarystringnon
observedstringnon
expectedstringnon
dueAtstringnon
ownerstringnonE-mail du responsable.
trackerIssueobjectnon
trackerIssue.keystringoui
trackerIssue.providerstringoui
trackerIssue.statusstringoui
trackerIssue.urlstringnon
reportListobject[]oui
reportList[].sourcestringouiwidget, slack, api, form…
reportList[].authorstringnon
reportList[].atstringouiISO 8601.
reportList[].textstringoui
fullContextobject | nullouiAvec Silex (plans Croissance et Entreprise) : diagnostic, fonctionnalité et fichiers rattachés, conversation de qualification, page, navigateur, console, erreurs réseau, capture et replay (liens signés, valables peu de temps). null sans Silex.

PATCH /v1/feedbacks/{key}

Changer le statut d'un feedback.

Même effet que depuis l'inbox, au nom de la personne qui a autorisé le jeton : le ticket Jira ou Linear lié suit, et delivered prévient les personnes qui suivent le feedback.

Paramètres

NomOùRequisDescription
keycheminouiClé lisible (FIF-12) ou identifiant.

Corps

ChampTypeRequisDescription
statustriage, prioritized, in_development, fixed, delivered, dismissedouitriage, prioritized, in_development, fixed, delivered (prévient les personnes qui suivent le feedback) ou dismissed.
commentstringnonAjouté au feedback ; pour dismissed, la raison.
curl -X PATCH https://api.galet.dev/v1/feedbacks/{key} \
  -H "Content-Type: application/json" \
  -d '{
    "status": "triage"
  }'

Réponses

Code HTTPDescription
200Le feedback à jour.
400invalid_json, invalid_body : corps invalide.
401unauthorized : jeton absent. invalid_token : jeton inconnu, expiré ou révoqué.
403insufficient_scope : le jeton n'a pas le scope feedbacks:write. forbidden : le rôle Lecteur ne peut pas modifier.
404not_found : aucun feedback avec cette clé dans l'organisation.

Corps de la réponse 200 :

ChampTypeToujours présentDescription
keystringouiClé lisible.
idstringoui
titlestringoui
kindproblem, idea, praiseoui
severityP0, P1, P2, P3non
statustriage, prioritized, in_development, fixed, delivered, dismissedoui
appobjectoui
app.idstringoui
app.namestringnon
featureobjectnonLa fonctionnalité rattachée, avec son chemin dans la carte.
feature.idstringoui
feature.pathstringoui
reportsintegerouiNombre de retours regroupés.
createdAtstringouiISO 8601.
lastActivityAtstringouiDernier retour reçu, ISO 8601.
urlstringouiLe feedback dans Galet.
naturestringnon
summarystringnon
observedstringnon
expectedstringnon
dueAtstringnon
ownerstringnonE-mail du responsable.
trackerIssueobjectnon
trackerIssue.keystringoui
trackerIssue.providerstringoui
trackerIssue.statusstringoui
trackerIssue.urlstringnon
reportListobject[]oui
reportList[].sourcestringouiwidget, slack, api, form…
reportList[].authorstringnon
reportList[].atstringouiISO 8601.
reportList[].textstringoui
fullContextobject | nullouiAvec Silex (plans Croissance et Entreprise) : diagnostic, fonctionnalité et fichiers rattachés, conversation de qualification, page, navigateur, console, erreurs réseau, capture et replay (liens signés, valables peu de temps). null sans Silex.

GET /v1/apps

Lister les apps.

curl https://api.galet.dev/v1/apps \
  -H "Authorization: Bearer $GALET_TOKEN"

Réponses

Code HTTPDescription
200Les apps de l'organisation.
401unauthorized : jeton absent. invalid_token : jeton inconnu, expiré ou révoqué.
403insufficient_scope : le jeton n'a pas le scope feedbacks:read.

Corps de la réponse 200 :

ChampTypeToujours présentDescription
dataobjet[]oui
data[].idstringoui
data[].namestringoui
data[].kindstringoui
data[].descriptionstringnon
data[].versionstringnon

GET /v1/apps/{id}/features

Lister les fonctionnalités d'une app.

La carte des fonctionnalités, à plat, avec le nombre de feedbacks ouverts sur chacune.

Paramètres

NomOùRequisDescription
idcheminouistring
curl https://api.galet.dev/v1/apps/:id/features \
  -H "Authorization: Bearer $GALET_TOKEN"

Réponses

Code HTTPDescription
200Les fonctionnalités.
401unauthorized : jeton absent. invalid_token : jeton inconnu, expiré ou révoqué.
403insufficient_scope : le jeton n'a pas le scope feedbacks:read.
404not_found : app inconnue.

Corps de la réponse 200 :

ChampTypeToujours présentDescription
dataobjet[]oui
data[].idstringoui
data[].namestringoui
data[].pathstringoui
data[].kindstringnon
data[].severityFloorstringnon
data[].cuesstring[]non
data[].codeobjet[]nonFichiers de code rattachés.
data[].openFeedbacksintegeroui

On this page