Skip to content

API Reference

This page documents the JSON output schemas for unfault review and unfault ask. These are useful when parsing CLI output programmatically or building integrations.

When you run unfault review --output json, the CLI returns a JSON object with the analysis results.

{
"session_id": "string",
"status": "created | analyzing | completed | failed | expired",
"meta": { ... },
"contexts": [ ... ],
"elapsed_ms": 142,
"error_message": "string | null"
}
FieldTypeDescription
session_idstringUnique identifier for this analysis session
statusenumSession status: created, analyzing, completed, failed, expired
metaobjectMetadata about the analysis (see below)
contextsarrayAnalysis results grouped by context (see below)
elapsed_msintegerTime taken for analysis in milliseconds
error_messagestring | nullError details if analysis failed
{
"label": "payments-service",
"languages": ["python"],
"framework_guesses": ["fastapi"],
"requested_dimensions": ["stability", "correctness"]
}
FieldTypeDescription
labelstringWorkspace label (usually directory name)
languagesarrayDetected programming languages
framework_guessesarrayDetected frameworks (e.g., fastapi, express)
requested_dimensionsarrayDimensions that were analyzed

Each context groups facts together. Currently, the primary fact type is rule_finding (shown as “findings” in the output):

{
"context_id": "ctx_workspace",
"label": "Workspace",
"findings": [ ... ]
}

A finding is a fact produced by rule analysis. It represents a detected pattern in your code:

{
"id": "python.http.missing_timeout:api/client.py:42",
"rule_id": "python.http.missing_timeout",
"kind": "StabilityRisk",
"title": "HTTP call has no timeout",
"description": "This HTTP call via requests.get has no timeout specified...",
"severity": "High",
"confidence": 0.9,
"dimension": "stability",
"file_path": "api/client.py",
"line": 42,
"column": 5,
"end_line": 42,
"end_column": 45,
"fix_preview": "Add timeout parameter: requests.get(url, timeout=30)"
}
FieldTypeDescription
idstringUnique finding identifier (format: rule_id:file_path:line)
rule_idstringRule that produced this finding
kindenumFinding category (see below)
titlestringShort title
descriptionstringDetailed explanation
severityenumCritical, High, Medium, Low, Info
confidencefloatConfidence score (0.0 to 1.0)
dimensionstringWhich dimension this finding relates to
file_pathstringFile path where the finding was detected
lineintegerLine number (1-based)
columninteger | nullColumn number (1-based)
end_lineinteger | nullEnd line number
end_columninteger | nullEnd column number
fix_previewstring | nullHuman-readable summary of suggested fix
KindDescription
StabilityRiskCould cause service instability or outages
PerformanceSmellMay impact performance
BehaviorThreatUnexpected behavior under certain conditions
AntiPatternCode pattern that typically leads to problems
ResourceLeakPotential resource leak (connections, memory)
ReliabilityRiskCould affect service reliability
SecurityVulnerabilitySecurity concern
SeverityDescription
CriticalImmediate action required
HighShould be addressed soon
MediumWorth addressing
LowMinor improvement
InfoInformational
DimensionDescription
stabilityService stability and resilience
performanceExecution speed and resource usage
correctnessLogic and behavior correctness
scalabilityAbility to handle increased load
observabilityLogging, tracing, and monitoring
reliabilityConsistent operation over time
securitySecurity posture
maintainabilityCode maintainability
{
"session_id": "sess_abc123def456",
"status": "completed",
"meta": {
"label": "payments-service",
"languages": ["python"],
"framework_guesses": ["fastapi"],
"requested_dimensions": ["stability", "correctness"]
},
"contexts": [
{
"context_id": "ctx_workspace",
"label": "Workspace",
"findings": [
{
"id": "python.http.missing_timeout:src/client.py:42",
"rule_id": "python.http.missing_timeout",
"kind": "StabilityRisk",
"title": "HTTP call has no timeout",
"description": "This HTTP call via requests.get has no timeout specified. If the remote service is slow or unresponsive, this call will block indefinitely.",
"severity": "High",
"confidence": 0.9,
"dimension": "stability",
"file_path": "src/client.py",
"line": 42,
"column": 5,
"fix_preview": "Add timeout parameter: requests.get(url, timeout=30)"
}
]
}
],
"elapsed_ms": 142,
"error_message": null
}

Facts are the underlying data model for all observations Unfault makes about your code. The review output above uses the rule_finding fact type, presented as “findings” for backward compatibility.

{
"fact_type": "rule_finding",
"fact_key": "python.http.missing_timeout:src/client.py:42",
"severity": "High",
"dimension": "stability",
"file_path": "src/client.py",
"line": 42,
"column": 5,
"rule_id": "python.http.missing_timeout",
"payload": { ... }
}
FieldTypeDescription
fact_typestringType discriminator (e.g., rule_finding, slo_state)
fact_keystringUnique key for deduplication within a session
severityenumCritical, High, Medium, Low, Info
dimensionstringWhich dimension this fact relates to
file_pathstring | nullFile path if location-specific
lineinteger | nullLine number (1-based)
columninteger | nullColumn number (1-based)
rule_idstring | nullRule ID for rule_finding facts
payloadobjectFact-type-specific data
TypeDescriptionStatus
rule_findingPattern detected by a ruleAvailable
slo_stateSLO compliance snapshotComing soon

For fact_type: "rule_finding", the payload contains the full finding details:

{
"finding_id": "python.http.missing_timeout:src/client.py:42",
"rule_id": "python.http.missing_timeout",
"kind": "StabilityRisk",
"title": "HTTP call has no timeout",
"description": "This HTTP call via requests.get has no timeout specified...",
"confidence": 0.9,
"fix_preview": "Add timeout parameter: requests.get(url, timeout=30)"
}

When you run unfault ask "query" --json, the CLI returns context retrieved from past analyses.

{
"query": "string",
"sessions": [ ... ],
"findings": [ ... ],
"sources": [ ... ],
"context_summary": "string",
"graph_context": { ... } | null,
"flow_context": { ... } | null,
"slo_context": { ... } | null
}
FieldTypeDescription
querystringOriginal query
sessionsarrayRetrieved session contexts
findingsarrayRetrieved finding contexts
sourcesarrayAll sources used in retrieval
context_summarystringBrief summary for LLM consumption
graph_contextobject | nullGraph-based context for structural queries
flow_contextobject | nullCall flow context for path tracing
slo_contextobject | nullSLO context for observability queries
{
"session_id": "550e8400-e29b-41d4-a716-446655440000",
"workspace_label": "payments-service",
"created_at": "2025-01-10T12:00:00Z",
"similarity": 0.85,
"total_findings": 5,
"dimension_counts": { "stability": 2, "performance": 3 },
"severity_counts": { "High": 1, "Medium": 4 }
}
FieldTypeDescription
session_idstringSession identifier
workspace_labelstringWorkspace name
created_atdatetimeWhen the session was created
similarityfloatSimilarity score to the query (0.0 to 1.0)
total_findingsintegerTotal findings in this session
dimension_countsobjectFindings count by dimension
severity_countsobjectFindings count by severity
{
"finding_id": "python.http.timeout:api/client.py:42",
"rule_id": "python.http.timeout",
"dimension": "stability",
"severity": "High",
"file_path": "api/client.py",
"line": 42,
"similarity": 0.78
}
FieldTypeDescription
finding_idstringFinding identifier
rule_idstringRule ID
dimensionstringDimension
severitystringSeverity level
file_pathstringFile path
lineintegerLine number
similarityfloatSimilarity score to the query

Returned for structural queries like “What breaks if I change this file?”:

{
"query_type": "impact",
"target_file": "src/core/auth.py",
"affected_files": [
{ "path": "src/api/routes.py", "depth": 1 },
{ "path": "src/api/middleware.py", "depth": 2 }
],
"dependencies": [],
"library_users": []
}
FieldTypeDescription
query_typestringType: impact, dependency, or general
target_filestringFile being analyzed
affected_filesarrayFiles affected by changes to target
dependenciesarrayExternal dependencies of target
library_usersarrayFiles using a specific library

Returned for call path queries like “How does authentication work?”:

{
"query": "authentication",
"root_nodes": [
{
"node_id": "func_validate_token",
"name": "validate_token",
"path": "src/auth.py",
"node_type": "function",
"depth": 0
}
],
"paths": [
[
{ "node_id": "route_login", "name": "POST /login", "node_type": "api_route", "depth": 0 },
{ "node_id": "func_authenticate", "name": "authenticate", "node_type": "function", "depth": 1 },
{ "node_id": "func_validate_token", "name": "validate_token", "node_type": "function", "depth": 2 }
]
]
}

Returned for observability queries:

{
"slos": [
{
"name": "API Availability",
"provider": "gcp",
"target_percent": 99.9,
"current_percent": 99.95,
"error_budget_remaining": 0.05
}
],
"monitored_routes": [
{ "name": "GET /api/users", "file": "src/routes.py" }
],
"unmonitored_routes": [
{ "name": "POST /internal/sync", "file": "src/internal.py" }
],
"summary": "3 SLOs linked to 15 routes, 2 routes unmonitored"
}
{
"query": "What are my main stability concerns?",
"sessions": [
{
"session_id": "550e8400-e29b-41d4-a716-446655440000",
"workspace_label": "payments-service",
"created_at": "2025-01-10T12:00:00Z",
"similarity": 0.85,
"total_findings": 5,
"dimension_counts": { "stability": 3, "correctness": 2 },
"severity_counts": { "High": 2, "Medium": 3 }
}
],
"findings": [
{
"finding_id": "python.http.missing_timeout:src/client.py:42",
"rule_id": "python.http.missing_timeout",
"dimension": "stability",
"severity": "High",
"file_path": "src/client.py",
"line": 42,
"similarity": 0.92
},
{
"finding_id": "python.resilience.missing_circuit_breaker:src/client.py:55",
"rule_id": "python.resilience.missing_circuit_breaker",
"dimension": "stability",
"severity": "High",
"file_path": "src/client.py",
"line": 55,
"similarity": 0.88
}
],
"sources": [
{
"source_type": "session",
"id": "550e8400-e29b-41d4-a716-446655440000",
"similarity": 0.85,
"metadata": { "total_findings": 5 }
},
{
"source_type": "finding",
"id": "python.http.missing_timeout:src/client.py:42",
"similarity": 0.92,
"metadata": {}
}
],
"context_summary": "Retrieved 1 session for payments-service with 5 findings. Main stability concerns: HTTP calls without timeouts, missing circuit breakers.",
"graph_context": null,
"flow_context": null,
"slo_context": null
}

Both commands use exit codes to indicate results:

CodeMeaning
0Success, no findings
1General error
2Configuration error
3Authentication failed
4Network error
5Findings detected
6Invalid input
7Service unavailable
8Session error
10Subscription required