> ## Documentation Index
> Fetch the complete documentation index at: https://docs.get-exo.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Brain

> The per-organization model: inspect it, query it directly, and retrain it.

## What this family does

Each organization gets its own model trained over its knowledge graph. `POST /v1/brain/query` runs one forward pass and returns the glass-box result: the focal nodes the model settled on, a cosine top-K head to compare against, gate confidence, drift rate and the propagation tier.

`GET /v1/brain/info` reports what is loaded and the state of the most recent train. `POST /v1/brain/answer` generates a voice-conditioned written answer. `POST /v1/brain/train` enqueues a retrain and requires `admin`.

## Routes

| Method | Path                                                         | Scope   | What it does                   |
| ------ | ------------------------------------------------------------ | ------- | ------------------------------ |
| `POST` | [`/v1/brain/answer`](/api-reference/brain/post-brain-answer) | `read`  | Answer with brain conditioning |
| `GET`  | [`/v1/brain/info`](/api-reference/brain/get-brain-info)      | `read`  | Get ExoBrain status            |
| `POST` | [`/v1/brain/query`](/api-reference/brain/post-brain-query)   | `read`  | Query the ExoBrain             |
| `POST` | [`/v1/brain/train`](/api-reference/brain/post-brain-train)   | `admin` | Train the ExoBrain             |

## Headers that apply here

Neither header is declared as an OpenAPI parameter, so neither appears in the generated schema tables.

* **`X-Exo-Subject` is refused** on the routes here that scope by the key owner. Sending it returns 400 [`subject_not_supported`](/errors/subject_not_supported) rather than reading the wrong partition.

## The shape of a call

Check what is loaded.

<CodeGroup>
  ```bash cURL theme={"theme":{"light":"github-light-default","dark":"github-dark-default"}}
  curl https://api.get-exo.com/v1/brain/info \
    -H "X-Exo-API-Key: $EXO_KEY"
  ```

  ```python Python theme={"theme":{"light":"github-light-default","dark":"github-dark-default"}}
  import httpx

  response = httpx.get(
      "https://api.get-exo.com/v1/brain/info",
      headers={"X-Exo-API-Key": EXO_KEY},
  )
  info = response.json()
  ```

  ```typescript TypeScript theme={"theme":{"light":"github-light-default","dark":"github-dark-default"}}
  const response = await fetch("https://api.get-exo.com/v1/brain/info", {
    headers: { "X-Exo-API-Key": process.env.EXO_KEY! },
  });
  const info = await response.json();
  ```
</CodeGroup>

The response:

```json theme={"theme":{"light":"github-light-default","dark":"github-dark-default"}}
{
  "training": { "status": "none" }
}
```

## Traps

**The whole family refuses `X-Exo-Subject`.** These routes read the key owner's own content. An explicit selector returns 400 `subject_not_supported` rather than being silently ignored, which would read the wrong partition.

**Query needs a trained brain.** No artifact yet is 404. An artifact that has just been published and is still being picked up is 409.

**One train per organization at a time.** A second request while one is queued or running is 409. A train that fails its numerical parity gate is not published, so the previous brain keeps serving.

## Related

<Columns cols={2}>
  <Card title="API reference" icon="book-open" href="/api-reference/overview">
    Base URL, authentication, and the conventions every route shares.
  </Card>

  <Card title="Errors" icon="circle-alert" href="/platform/errors">
    The problem envelope and the full code catalogue.
  </Card>
</Columns>
