> ## Documentation Index
> Fetch the complete documentation index at: https://docs.locusmedical.fr/llms.txt
> Use this file to discover all available pages before exploring further.

# Poser un retour utilisateur sur une réponse tracée

> Attache un pouce levé/baissé à une réponse déjà servie, via le `trace_id` qu'elle portait.

Idempotent : re-poster écrase le vote précédent. C'est ce qui permet à l'utilisateur de changer d'avis, et à un client de re-tenter un envoi perdu sans compter deux fois.

`404` quand le `trace_id` est inconnu — typiquement une réponse servie alors que la journalisation était coupée, ou plus vieille que la rétention. `503` quand la journalisation est désactivée sur cette instance : il n'y a alors aucune trace à noter, et le dire est plus utile que d'accepter un vote qui n'ira nulle part.



## OpenAPI

````yaml /openapi.json post /v2/feedback
openapi: 3.1.0
info:
  title: Locus API
  description: >-
    Locus knowledge layer — REST + MCP for clinical knowledge.


    Two categories of surface:

    - **query** (read) — `/v1/search`, `/v1/answer`, `/v1/context` (legacy Meili
    contract serving AlmaPro) and `/v2/retrieve` (knowledge-graph retrieval, MKF
    0.1.3).

    - **ops** — `/health`.


    The write plane (PDF → Neo4j graph: ingest, summarize, MKU extraction) is
    NOT exposed over HTTP — it is a batch pipeline driven by the `locus` CLI,
    which runs where the source PDFs are.
  version: 0.2.0
servers:
  - url: https://core.locusmedical.fr
    description: Production
security: []
paths:
  /v2/feedback:
    post:
      tags:
        - query
      summary: Poser un retour utilisateur sur une réponse tracée
      description: >-
        Attache un pouce levé/baissé à une réponse déjà servie, via le
        `trace_id` qu'elle portait.


        Idempotent : re-poster écrase le vote précédent. C'est ce qui permet à
        l'utilisateur de changer d'avis, et à un client de re-tenter un envoi
        perdu sans compter deux fois.


        `404` quand le `trace_id` est inconnu — typiquement une réponse servie
        alors que la journalisation était coupée, ou plus vieille que la
        rétention. `503` quand la journalisation est désactivée sur cette
        instance : il n'y a alors aucune trace à noter, et le dire est plus
        utile que d'accepter un vote qui n'ira nulle part.
      operationId: feedback_endpoint_v2_feedback_post
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/FeedbackRequest'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FeedbackResponse'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
      security:
        - lsk: []
components:
  schemas:
    FeedbackRequest:
      properties:
        trace_id:
          type: string
          title: Trace Id
          description: >-
            L'identifiant rendu par `/v2/retrieve` (champ `trace_id` de la
            payload, ou de la ligne `done` du flux).
        vote:
          type: integer
          maximum: 1
          minimum: -1
          title: Vote
          description: >-
            `1` pouce levé · `-1` pouce baissé · `0` vote retiré.


            `0` existe pour que se dédire soit un geste écrit comme un autre :
            sans lui, retirer un pouce obligerait à supprimer la ligne, et on
            perdrait la réponse tracée en même temps que l'avis.
        note:
          anyOf:
            - type: string
              maxLength: 2000
            - type: 'null'
          title: Note
          description: Motif libre, facultatif — surtout utile après un pouce baissé.
      type: object
      required:
        - trace_id
        - vote
      title: FeedbackRequest
    FeedbackResponse:
      properties:
        ok:
          type: boolean
          title: Ok
          default: true
        trace_id:
          type: string
          title: Trace Id
        vote:
          type: integer
          title: Vote
      type: object
      required:
        - trace_id
        - vote
      title: FeedbackResponse
    HTTPValidationError:
      properties:
        detail:
          items:
            $ref: '#/components/schemas/ValidationError'
          type: array
          title: Detail
      type: object
      title: HTTPValidationError
    ValidationError:
      properties:
        loc:
          items:
            anyOf:
              - type: string
              - type: integer
          type: array
          title: Location
        msg:
          type: string
          title: Message
        type:
          type: string
          title: Error Type
        input:
          title: Input
        ctx:
          type: object
          title: Context
      type: object
      required:
        - loc
        - msg
        - type
      title: ValidationError
  securitySchemes:
    lsk:
      type: http
      description: Locus API key — paste the raw `lsk_…` value (no 'Bearer ' prefix).
      scheme: bearer

````