Response object reference — POST /analyze
The POST /analyze endpoint returns a JSON object with the result of the risk analysis. The object is stateless: it reflects exclusively the analysis of that specific call. vario does not store the submitted text or the result — the response object is the sole product of the call.
Field table
| Field | Type | Description |
|---|---|---|
combined_score | float [0–10] | Aggregated risk score. 0 indicates no signal; 10 indicates maximum signal. |
should_alert | boolean | true if the system recommends human review for this communication. |
severity | string | Risk category: "critical" | "high" | "medium" | "low". |
reasoning | string | Narrative explanation of the analysis, in the language defined by the language field of the request. Empty if deep analysis was not available. |
key_phrases | array[string] | Phrases from the text identified as relevant to the analyzed conduct. |
regulatory_frameworks | array[string] | Regulatory frameworks identified as potentially applicable (for example: "FCPA", "DL 211", "MAR"). |
conduct_type | string | Conduct detected by the pipeline. Open classification: may differ from the requested playbook. Closed domain of 7 values: "price_fixing" · "bid_rigging" · "bribery" · "market_manipulation" · "information_exchange" · "group_boycott" · "none". Always "none" in l1_discard. Absent in screening. |
recommended_action | string | Suggested action. Closed domain, tier-dependent — fast/l2_pass/degraded: "no_action" | "monitoring" | "legal_review"; full mode (L3 passthrough): adds "open_case" | "dismiss" | "immediate_escalation". System recommendation; the reviewer decides. |
confidence | string | Confidence level of the complete analysis: "high" | "medium" | "low". |
processing_path | string | null | Pipeline stage that produced the response. Non-breaking field: clients that do not know it ignore it without error. See the table in POST /analyze. |
mode_used | string | Mode effectively executed: "screening" | "fast" | "full". In screening mode the response schema is different — see the section at the end of this page. |
analyzed_at | string (ISO 8601) | UTC timestamp of the analysis. |
pipeline_version | string | Version of the analysis engine (opaque string — do not parse or rely on its internal structure). |
bedrock_available | boolean | false if deep analysis was not available for this call. When false, the response is partial. |
How to interpret combined_score
combined_score is a floating-point number in the range 0 to 10:
- 0 — no signal detected for the analyzed conduct.
- 10 — maximum signal; the communication presents very strong indicators of the conduct.
The scale is ordinal, not linear: the distance between 7 and 8 is not equivalent to the distance between 3 and 4. Do not compare scores from different calls as if they were absolute magnitudes; use them to prioritize within a corpus.
The severity field expresses the same result in qualitative categories, more useful for making triage decisions. The should_alert field is the recommended binary indicator for integration in automated workflows.
How to interpret severity
severity categorizes the risk level of the communication:
| Value | Meaning |
|---|---|
"critical" | Very strong signal. The communication presents consistent and direct indicators of the analyzed conduct. Urgent review recommended. |
"high" | Significant signal. Indicators are clear, though not as concentrated. Priority review recommended. |
"medium" | Moderate signal. There are elements of interest but context is ambiguous. |
"low" | Weak signal. The communication does not present strong indicators. |
The determination of severity is the system's responsibility; the decision to act on it is always the human reviewer's responsibility.
How to use reasoning and key_phrases
reasoning is a narrative explanation generated in the language of the analyzed text. It describes which elements of the communication contributed to the result. Its purpose is to provide context to the human reviewer — it is not a legal ruling or a definitive conclusion.
key_phrases is an array of fragments extracted from the text that the system identified as relevant to the analyzed conduct. They can be used to quickly locate the parts of the message that drove the score.
Important considerations:
- Both
reasoningandkey_phrasesare orientation tools for the reviewer, not substitutes for legal analysis. - When
bedrock_availableisfalse,reasoningmay be empty or less detailed. key_phrasesmay be an empty array ([]) if the system did not identify specific fragments with sufficient confidence.
How to use regulatory_frameworks
regulatory_frameworks lists the regulatory frameworks the system identified as potentially relevant to the analyzed communication. Examples of possible values: "FCPA", "DL 211", "MAR", "Lei Anticorrupção 12.846/2013", "CADE", "COFECE".
Important considerations:
- This list reflects the frameworks the system associated with the detected signal. It is not a legal opinion.
- It does not replace specialized legal advice.
- The array may be empty (
[]) if the system did not identify frameworks with sufficient confidence.
Privacy
vario does not store or retain the analyzed text. The pipeline is completely stateless: no data from the text or thread_context fields persists in vario's database.
Degradation: when bedrock_available is false
If deep analysis was not available at the time of the call, the endpoint returns 200 with bedrock_available: false. In this case:
reasoningmay be empty.confidencemay be"low". To receive an explicit error instead of a partial response, include the headerPrefer: deep-analysis-required. In that case, the endpoint returns503 DEEP_ANALYSIS_UNAVAILABLEwhen deep analysis is not available.
Complete response example
High signal of price coordination, analyzed in full mode:
{
"combined_score": 8.4,
"should_alert": true,
"severity": "critical",
"reasoning": "El mensaje contiene una indicación explícita de coordinar el precio mínimo de venta con un competidor. La referencia directa a un valor de precio y la expectativa de que otros actores del mercado lo respetarán son indicadores consistentes con coordinación horizontal de precios.",
"key_phrases": [
"no bajamos de $450 la unidad",
"los demás van a hacer lo mismo",
"acordamos no competir por precio"
],
"regulatory_frameworks": [
"DL 211 (Chile)",
"Lei Anticorrupção 12.846/2013 (Brasil)",
"COFECE — Ley Federal de Competencia Económica"
],
"recommended_action": "legal_review",
"confidence": "high",
"mode_used": "full",
"analyzed_at": "2026-06-02T14:32:00Z",
"pipeline_version": "1.0",
"bedrock_available": true
}
Example in fast mode with low signal
{
"combined_score": 1.2,
"should_alert": false,
"severity": "low",
"reasoning": "No se identificaron indicadores relevantes de la conducta analizada en el texto proporcionado.",
"key_phrases": [],
"regulatory_frameworks": [],
"recommended_action": "no_action",
"confidence": "high",
"mode_used": "fast",
"analyzed_at": "2026-06-02T14:33:10Z",
"pipeline_version": "1.0",
"bedrock_available": true
}
Example with degradation (bedrock_available: false)
{
"combined_score": 3.1,
"should_alert": false,
"severity": "medium",
"reasoning": "",
"key_phrases": [],
"regulatory_frameworks": [],
"recommended_action": "monitoring",
"confidence": "low",
"mode_used": "fast",
"analyzed_at": "2026-06-02T15:01:42Z",
"pipeline_version": "1.0",
"bedrock_available": false
}
Response in screening mode
When mode_used is "screening", the response object has a different schema from fast and full modes. It only includes L1 layer results (keyword + embedding). The fields combined_score, should_alert, severity, reasoning, key_phrases, regulatory_frameworks, recommended_action, confidence, and bedrock_available are not present.
| Field | Type | Description |
|---|---|---|
mode_used | string | "screening" |
l1_score | float [0–1] | Aggregated L1 score: max(l1_keyword_score, l1_embedding_score). |
l1_keyword_score | float [0–1] | Keyword detection score. |
l1_embedding_score | float [0–1] | Semantic similarity score via embeddings. |
l1_matched_terms | array[string] | Terms in the text that triggered L1 detection. |
l1_embedding_available | boolean | true if the embedding service was available. |
playbook | string | Echo of the playbook field in the request. |
playbook_version | string | Version of the playbook used. |
pipeline_version | string | Version of the analysis engine. |
analyzed_at | string (ISO 8601) | UTC timestamp of the analysis. |
external_id | string | null | Echo of the external_id sent in the request. |
Example response in screening mode:
{
"mode_used": "screening",
"l1_score": 0.82,
"l1_keyword_score": 0.75,
"l1_embedding_score": 0.82,
"l1_matched_terms": ["acordamos no movernos del precio", "precio"],
"l1_embedding_available": true,
"playbook": "price_fixing",
"playbook_version": "1.0",
"pipeline_version": "1.0",
"analyzed_at": "2026-06-04T10:15:00Z",
"external_id": "email-msg-00842"
}
Final notes
- The output of
POST /analyzeis a risk signal, not a legal determination. It does not replace review by an attorney, nor does it constitute evidence before regulators. - vario alerts; the CCO decides. The principle of human review is part of the system's design.