Brain Validation API¶
Review findings after connectors sync into the Digital Brain. The Fermi app Brain validation screen uses these URLs. They accept a service actor token.
Base URL¶
There is no /public/v1/analytics/validation rewrite. Use the full core-analytics path.
Authentication¶
Required scopes: brain:read for list; brain:write for approve, reject, skip, and edit.
List findings¶
GET /findings
{
"status": "ok",
"count": 2,
"counters": {
"pending": 2,
"approved": 0,
"rejected": 0,
"reviewed": 0,
"total": 2
},
"findings": [
{
"finding_id": "example-finding-id",
"tenant_id": "507f1f77bcf86cd799439011",
"connection_ids": ["5c096330-fc54-4144-bfec-6bd344da9586"],
"title": "Example finding title",
"theme": "Data Source Integration",
"confidence": 0.8,
"status": "completed",
"review_state": "pending",
"what_was_learned": [],
"new_discoveries": [],
"source_refs": [],
"node_ids": [],
"context_node_ids": []
}
]
}
GET /findings/approved and GET /findings/rejected return the same shape, filtered by review state.
Finding detail¶
GET /findings/{finding_id}
{
"status": "ok",
"finding_id": "example-finding-id",
"processing": false,
"review_state": "pending",
"finding": {}
}
Approve, reject, skip¶
POST /findings/{finding_id}/approve — empty JSON body
POST /findings/{finding_id}/reject — empty JSON body
PATCH /findings/{finding_id}/skip — { "is_skipped": true }
POST /findings/approve-bulk — { "finding_ids": ["example-finding-id"] }
Edit a finding¶
POST /findings/{finding_id}/edit
For long edits, POST /findings/{finding_id}/edit/stream with the same body. The response is SSE (text/event-stream).
Summary¶
| Method | Path |
|---|---|
| GET | /findings |
| GET | /findings/approved |
| GET | /findings/rejected |
| GET | /findings/{finding_id} |
| POST | /findings/{finding_id}/approve |
| POST | /findings/{finding_id}/reject |
| PATCH | /findings/{finding_id}/skip |
| POST | /findings/approve-bulk |
| POST | /findings/{finding_id}/edit |
| POST | /findings/{finding_id}/edit/stream |