---
title: "Diagnostic guidé PAC Air/Eau (multi-tours)"
method: POST
path: "/v1/diagnostic/turn"
---

# Diagnostic guidé PAC Air/Eau (multi-tours)

`POST /v1/diagnostic/turn`

## Request

- Base URL: `https://api.askmarcel.app`
- URL: `https://api.askmarcel.app/v1/diagnostic/turn`
- Auth: HTTP bearer

Un tour de dépannage guidé PAC Air/Eau : état diagnostique calculé côté serveur. Historique scellé via `continuation`. Hors PAC Air/Eau → kind=out_of_scope (non facturé). Facturation outcome sur kind=verdict uniquement. Header `Idempotency-Key` **obligatoire** : rejeu = même body, zéro LLM, zéro quota. Lookup one-shot : POST /v1/diagnostic.

## Headers

- `Idempotency-Key` string, required: Clé d’idempotence du tour (obligatoire). Rejeu de la même clé + même payload → même réponse, sans nouvel appel LLM ni quota. Clé identique + payload différent → 409 idempotency_conflict. Redis indisponible → 503 service_unavailable.

## Request body

- GuidedTurnInput
  - `message` string, required
  - `continuation` string
  - `context` GuidedContext
    - `brand` string
    - `model` string
    - `error_code` string
    - `emitter` 'plancher_chauffant' | 'radiateurs_bt' | 'radiateurs_ht' | 'ventilo_convecteur'
  - `lang` 'fr' | 'en' | 'es' | 'de' | 'it' | 'ru'
  - `request_id` string

## Response `200`

question | verdict | emergency | out_of_scope

- union
  - object
    - `kind` 'question', required
    - `question` string, required
    - `why` string
    - `intent` 'clarification' | 'measurement', required
    - `measurement` object
      - `quantity_id` string, required
      - `unit` string
      - `method` string
      - `conditions` string
    - `safety_warnings` string[], required
    - `ledger` GuidedLedger, required
      - `measurements` object[], required
        - `quantity_id` string, required
        - `value` string, required
        - `position` string, nullable, required
      - `confirmed` string[], required
      - `eliminated` string[], required
      - `in_play` string[], required
      - `to_measure` string[], required
      - `terminal` 'none' | 'conclusion' | 'escalade', required
    - `continuation` string, required
    - `turn` integer, required
    - `speak` Speak
      - `text` string, required
      - `must_be_verbatim` boolean, required
    - `expected_input` ExpectedInput
      - `quantity_id` string, required
      - `type` 'number' | 'text' | 'enum', required
      - `unit` string
    - `request_id` string, required
    - `session_id` string, required
    - `engine_version` string, required
    - `protocol_id` string, nullable, required
    - `protocol_version` string, nullable, required
    - `decision_trace` DecisionTrace, nullable, required
      - `family` string, required
      - `protocol_id` string, required
      - `protocol_version` string, required
      - `protocol_content_hash` string, required
      - `engine_version` string, required
      - `reducer_version` string, required
      - `consumed_event_types` string[], required
      - `rules_fired` string[], required
      - `evidence` DecisionTraceEvidence[], required
        - `quantity_id` string, required
        - `cause_id` string, required
        - `role` 'state' | 'orienting' | 'confirmatory' | 'contradictory' | 'exclusion', required
        - `outcome` 'confirme' | 'contredit' | 'non_mesure' | 'plage_non_resolue' | 'not_applicable' | 'ignore', required
      - `transition` 'none' | 'conclusion' | 'escalade' | 'emergency' | 'out_of_scope', required
      - `transition_reason` string, required
      - `rejections` DecisionTraceRejection[], required
        - `session_event_id` string, uuid, required
        - `code` string, required
  - object
    - `kind` 'verdict', required
    - `verdict` 'conclusion' | 'escalade', required
    - `cause` object
      - `id` string, required
      - `label` string, required
    - `evidence` string[], required
    - `steps` object[], required
      - `order` integer, required
      - `title` string, required
      - `detail` string
    - `escalation` object, nullable
      - `motif` string, required
      - `detail` string, required
    - `sources` object[], required
      - `document_id` string, required
      - `page_start` number, required
      - `doc_title` string
    - `ledger` GuidedLedger, required
      - `measurements` object[], required
        - `quantity_id` string, required
        - `value` string, required
        - `position` string, nullable, required
      - `confirmed` string[], required
      - `eliminated` string[], required
      - `in_play` string[], required
      - `to_measure` string[], required
      - `terminal` 'none' | 'conclusion' | 'escalade', required
    - `continuation` unknown, required
    - `turn` integer, required
    - `speak` Speak
      - `text` string, required
      - `must_be_verbatim` boolean, required
    - `request_id` string, required
    - `session_id` string, required
    - `engine_version` string, required
    - `protocol_id` string, nullable, required
    - `protocol_version` string, nullable, required
    - `decision_trace` DecisionTrace, nullable, required
      - `family` string, required
      - `protocol_id` string, required
      - `protocol_version` string, required
      - `protocol_content_hash` string, required
      - `engine_version` string, required
      - `reducer_version` string, required
      - `consumed_event_types` string[], required
      - `rules_fired` string[], required
      - `evidence` DecisionTraceEvidence[], required
        - `quantity_id` string, required
        - `cause_id` string, required
        - `role` 'state' | 'orienting' | 'confirmatory' | 'contradictory' | 'exclusion', required
        - `outcome` 'confirme' | 'contredit' | 'non_mesure' | 'plage_non_resolue' | 'not_applicable' | 'ignore', required
      - `transition` 'none' | 'conclusion' | 'escalade' | 'emergency' | 'out_of_scope', required
      - `transition_reason` string, required
      - `rejections` DecisionTraceRejection[], required
        - `session_event_id` string, uuid, required
        - `code` string, required
  - object
    - `kind` 'emergency', required
    - `type` string, required
    - `consignes` string[], required
    - `interdits` string[], required
    - `contact` object
      - `libelle` string, required
      - `numero` string, required
    - `ledger` GuidedLedger, required
      - `measurements` object[], required
        - `quantity_id` string, required
        - `value` string, required
        - `position` string, nullable, required
      - `confirmed` string[], required
      - `eliminated` string[], required
      - `in_play` string[], required
      - `to_measure` string[], required
      - `terminal` 'none' | 'conclusion' | 'escalade', required
    - `continuation` unknown, required
    - `turn` integer, required
    - `speak` Speak
      - `text` string, required
      - `must_be_verbatim` boolean, required
    - `request_id` string, required
    - `session_id` string, required
    - `engine_version` string, required
    - `protocol_id` string, nullable, required
    - `protocol_version` string, nullable, required
    - `decision_trace` DecisionTrace, nullable, required
      - `family` string, required
      - `protocol_id` string, required
      - `protocol_version` string, required
      - `protocol_content_hash` string, required
      - `engine_version` string, required
      - `reducer_version` string, required
      - `consumed_event_types` string[], required
      - `rules_fired` string[], required
      - `evidence` DecisionTraceEvidence[], required
        - `quantity_id` string, required
        - `cause_id` string, required
        - `role` 'state' | 'orienting' | 'confirmatory' | 'contradictory' | 'exclusion', required
        - `outcome` 'confirme' | 'contredit' | 'non_mesure' | 'plage_non_resolue' | 'not_applicable' | 'ignore', required
      - `transition` 'none' | 'conclusion' | 'escalade' | 'emergency' | 'out_of_scope', required
      - `transition_reason` string, required
      - `rejections` DecisionTraceRejection[], required
        - `session_event_id` string, uuid, required
        - `code` string, required
  - object
    - `kind` 'out_of_scope', required
    - `reason` string, required
    - `detected_family` string, nullable, required
    - `fallback_tool` 'diagnose', required
    - `turn` integer, required
    - `request_id` string, required
    - `session_id` string, required
    - `engine_version` string, required
    - `protocol_id` string, nullable, required
    - `protocol_version` string, nullable, required
    - `decision_trace` DecisionTrace, nullable, required
      - `family` string, required
      - `protocol_id` string, required
      - `protocol_version` string, required
      - `protocol_content_hash` string, required
      - `engine_version` string, required
      - `reducer_version` string, required
      - `consumed_event_types` string[], required
      - `rules_fired` string[], required
      - `evidence` DecisionTraceEvidence[], required
        - `quantity_id` string, required
        - `cause_id` string, required
        - `role` 'state' | 'orienting' | 'confirmatory' | 'contradictory' | 'exclusion', required
        - `outcome` 'confirme' | 'contredit' | 'non_mesure' | 'plage_non_resolue' | 'not_applicable' | 'ignore', required
      - `transition` 'none' | 'conclusion' | 'escalade' | 'emergency' | 'out_of_scope', required
      - `transition_reason` string, required
      - `rejections` DecisionTraceRejection[], required
        - `session_event_id` string, uuid, required
        - `code` string, required

## Other responses

- `400`: Erreur contractuelle
- `409`: Erreur contractuelle
- `503`: Erreur contractuelle

---

[API](https://skmtc.dev/askmarcel/apis/askmarcel-api.md) · [All operations](https://skmtc.dev/askmarcel/apis/askmarcel-api/llms.txt) · [OpenAPI document](https://skmtc.dev/askmarcel/apis/askmarcel-api/revisions/6865e207410e?raw)
