Skip to content

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

BASE_URL = "https://api.fermi.dev/core-analytics/validation"

There is no /public/v1/analytics/validation rewrite. Use the full core-analytics path.

Authentication

Authorization: Bearer <service-actor-token>

Required scopes: brain:read for list; brain:write for approve, reject, skip, and edit.

List findings

GET /findings

curl --request GET \
  --url "${BASE_URL}/findings" \
  --header "Authorization: Bearer <token>"
{
  "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

{
  "finding_id": "example-finding-id",
  "user_request": "Rename this relationship to BELONGS_TO"
}

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

Next Steps