---
title: "Answer a question with receipts (facts + scores + provenance)"
method: POST
path: "/pots/{pot_id}/synthesize"
tags: ["synthesis", "synthesis"]
---

# Answer a question with receipts (facts + scores + provenance)

`POST /pots/{pot_id}/synthesize`

Retrieve relevant facts from a POT and produce a synthesized natural-language answer **with receipts**: cited facts, POT Scores, source provenance, detected contradictions, and an optional epistemic briefing summarizing the system's confidence and coverage gaps.

**Flow under the hood:**
1. The Hybrid Router classifies the query and selects an optimal retrieval strategy — `CAG` (cached, <5ms), `RAG` (semantic vector), `GraphRAG` (graph traversal following edges), or a combination.
2. Top facts are retrieved and ranked using `combined = (similarity × 0.7) + (pot_score × 0.3)`.
3. Full provenance is fetched for each fact.
4. Contradictions are detected among the retrieved set (flag-only, never auto-resolved).
5. The LLM composes an answer with calibrated certainty (high-score facts spoken plainly; lower-score facts hedged or omitted).
6. The response includes the answer, the facts used, contradictions, and an `epistemic_briefing` block describing what the system is confident about and where coverage is thin.

**Production guidance:** for any consequential agent, set `include_epistemic_briefing=true` and treat unresolved contradictions (`contradictions_found`) as a signal that may justify deferring to a human.

## Path parameters

- `pot_id` string, required — POT identifier (UUID or slug)

## Request body

- SynthesisRequest — Request body for synthesis endpoint.
  - `query` string, required — Question to answer from the knowledge base
  - `max_facts` integer — Maximum facts to retrieve for synthesis
  - `include_epistemic_briefing` boolean — Include epistemic briefing in response (certainty guidance)

## Response `200`

Synthesized answer with epistemic metadata + receipts

- SynthesisResponse — Response from synthesis endpoint.
  - `answer` string, required — Synthesized answer from LLM
  - `facts_used` SynthesisFactItem[], required — Facts used for synthesis
    - `fact_id` string, required
    - `content` string, required
    - `title` string, nullable — Short title for display (M19)
    - `pot_score` number, required
    - `original_pot_score` number, nullable — Pre-propagation POT Score (M19)
    - `level` 'CONSTITUTION' | 'VERIFIED' | 'SUPPORTED' | 'INFERRED' | 'HYPOTHESIS' | 'SPECULATION', required — POT Index levels matching score ranges.
    - `source` string, required — Retrieval strategy that found this fact
    - `document_id` string, nullable — Source document UUID (M19)
    - `provenance` FactProvenance — Provenance information for a synthesized fact.
      - `type` string, required — Source type: extracted, manual, inferred, imported
      - `sources` object[] — Source documents with id, type, reference, path
  - `strategy_used` string, required — Retrieval strategy used
  - `total_facts_retrieved` integer, required
  - `llm_model` string, required — LLM model used for synthesis
  - `llm_cost_usd` number, required — Cost of LLM call
  - `latency_ms` number, required — Total latency including retrieval + synthesis
  - `epistemic_briefing` EpistemicBriefingResponse — Epistemic briefing included in synthesis response.
    - `certainty_summary` CertaintySummary, required — Distribution of facts by certainty level.
      - `total_facts` integer, required
      - `constitution` integer
      - `verified` integer
      - `extracted` integer
      - `inferred` integer
      - `pending` integer
      - `average_score` number
    - `high_confidence_facts` string[] — Fact references that can be stated boldly
    - `hedged_facts` string[] — Fact references needing qualification
    - `contradictions` string[] — Descriptions of contradictions found
    - `knowledge_gaps` string[] — Identified gaps in available knowledge
    - `provenance_notes` string[] — Notes about source quality and types
  - `contradictions_found` ContradictionItem[] — Contradictions detected among retrieved facts
    - `fact_id_a` string, required
    - `fact_id_b` string, required
    - `content_a` string, required
    - `content_b` string, required
    - `weight` number, required — Contradiction edge weight
    - `rationale` string — Explanation of the contradiction
  - `is_knowledge_gap` boolean, required — Convenience flag: true when the answer is likely a knowledge gap (gap_signal.confidence < threshold). The integrator decides whether to act on it.
  - `gap_signal` GapSignal, required — Structured gap signal attached to a synthesis response.
    - `version` string, required — Formula version; pin behaviour against this.
    - `confidence` number, required — Confidence the answer is grounded (higher = better).
    - `is_knowledge_gap` boolean, required — True when confidence < threshold — a candidate gap to escalate.
    - `threshold` number, required — Threshold applied to confidence.
    - `total_facts` integer, required — Facts retrieved for synthesis.
    - `high_certainty_facts` integer, required — Count of Constitution + Verified facts among them.
    - `average_score` number, required — Mean POT Score of retrieved facts.
    - `reasons` string[] — Human-readable factors behind the score.

## Other responses

- `404` — POT not found in this workspace
- `422` — Validation Error
- `429` — Token quota exceeded for workspace
- `500` — Retrieval or synthesis error

---

[API](https://skmtc.net/scipot/apis/scipot-core-api.md) · [All operations](https://skmtc.net/scipot/apis/scipot-core-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/scipot/scipot-core-api/versions/e8712e9ffeae/schema)
