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

# Data graph

> Read the map of your organization's connections and the derivations scheduled on them, with the evidence behind every link.

The data graph is a read-only map of your organization's connections and the derivations built from them. A derivation is a dataset Nexio computes from a connection on a publication schedule. Each link carries a plain statement of the evidence behind it. Use it to see which connections you have and what Nexio builds from each one.

The graph is public API under `/api/v1/graph`. It has three read routes and no writes.

## How it works

1. You call a graph route with your API key.
2. Nexio assembles the whole graph for your organization from its own records at request time.
3. The route filters the assembled graph (all of it, one node kind, or one node and its links) and returns it with `generatedAt`, the time the graph was assembled.

Because every call assembles the whole graph first, the three routes cost about the same on the server. Call the narrowest one that answers your question to keep the response small.

## Nodes and links

A node is one thing in your data estate, and its kind says what sort of thing. Node kinds are a closed registry of 16, fixed in code: `connection`, `warehouse_census`, `schema_group`, `warehouse_table`, `corpus`, `doc_type_group`, `document`, `landing_plane`, `landed_table`, `canon`, `served_table`, `reference_store`, `live_source`, `derivation`, `engine` and `api_surface`. The API serves 14 of them; `document` and `warehouse_table` answer 400 `unsupported_node_type`. Of the 14, the graph emits two kinds today.

| Kind         | Lane          | What the node is                                                                                                                                                                                                                                          |
| ------------ | ------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `connection` | `sources`     | A configured connection that has not been deleted. `summary` names the source family, for example `Customer Snowflake warehouse`. `status` is the connection's status. `freshness` is the latest time Nexio recorded activity on it, or null.             |
| `derivation` | `derivations` | A dataset with at least one publication schedule on an active connection. `counts` carries `activeSchedules`, `pausedSchedules` and `connections`. `status` is `active`, `paused` or `failed`. `freshness` is the finish time of its latest run, or null. |

The other 12 served kinds return an empty `nodes` array today.

A node key is `<kind>:<id segments>`, for example `connection:5f0c9a52-1d2b-4c47-9a0e-3b8d6f1e2a47`. The routes take the kind and the rest of the key as two path segments.

A link (an edge) joins two nodes. Today every edge is a `feeds` edge from a connection to a derivation scheduled on it. `evidence.statement` says in one sentence why the link exists: an active schedule, or a paused one. `observed` is `false`, because the link comes from configuration rather than recorded activity.

The whole-graph response also carries `findings`. It is an empty array today.

## What you call

| Route                                                                           | Returns                                  |
| ------------------------------------------------------------------------------- | ---------------------------------------- |
| [`GET /api/v1/graph`](/api-reference/graph/get-graph)                           | Every node and edge, and `findings`.     |
| [`GET /api/v1/graph/{nodeType}`](/api-reference/graph/list-graph-nodes)         | Every node of one kind.                  |
| [`GET /api/v1/graph/{nodeType}/{nodeKey}`](/api-reference/graph/get-graph-node) | One node and every edge that touches it. |

Credential: the organization's live API key, or a scoped key with `graph:read`. A sandbox or test organization key gets 403 `scoped_key_required`. See [Authentication and access](/authentication).

## Example: list your connections

<CodeGroup>
  ```bash curl theme={null}
  curl https://api.usenexio.com/api/v1/graph/connection \
    -H "Authorization: Bearer $NEXIO_API_KEY"
  ```

  ```python Python theme={null}
  import os
  import requests

  response = requests.get(
      "https://api.usenexio.com/api/v1/graph/connection",
      headers={"Authorization": "Bearer " + os.environ["NEXIO_API_KEY"]},
      timeout=30,
  )
  response.raise_for_status()
  for node in response.json()["nodes"]:
      print(node["key"], node["label"], node["status"])
  ```

  ```typescript TypeScript theme={null}
  const response = await fetch("https://api.usenexio.com/api/v1/graph/connection", {
    headers: { Authorization: `Bearer ${process.env.NEXIO_API_KEY}` },
  });
  if (!response.ok) throw new Error(`graph read failed: ${response.status}`);
  const body = await response.json();
  for (const node of body.nodes) console.log(node.key, node.label, node.status);
  ```
</CodeGroup>

```json 200 OK theme={null}
{
  "org": { "id": "0b7d4c1e-6a2f-4e8b-9d3c-5f1a2b3c4d5e" },
  "nodes": [
    {
      "kind": "connection",
      "key": "connection:5f0c9a52-1d2b-4c47-9a0e-3b8d6f1e2a47",
      "label": "Harbor Group warehouse",
      "summary": "Customer Snowflake warehouse",
      "lane": "sources",
      "counts": {},
      "freshness": "2026-09-23T06:00:12.000Z",
      "status": "ACTIVE",
      "expandable": false
    },
    {
      "kind": "connection",
      "key": "connection:8a1e2b3c-4d5f-4a6b-8c7d-9e0f1a2b3c4d",
      "label": "Harbor Group contract library",
      "summary": "SharePoint document corpus",
      "lane": "sources",
      "counts": {},
      "freshness": null,
      "status": "ACTIVE",
      "expandable": false
    }
  ],
  "generatedAt": "2026-09-23T14:02:11.482Z"
}
```

## Example: one node and its links

<CodeGroup>
  ```bash curl theme={null}
  curl https://api.usenexio.com/api/v1/graph/connection/5f0c9a52-1d2b-4c47-9a0e-3b8d6f1e2a47 \
    -H "Authorization: Bearer $NEXIO_API_KEY"
  ```

  ```python Python theme={null}
  import os
  import requests

  response = requests.get(
      "https://api.usenexio.com/api/v1/graph/connection/5f0c9a52-1d2b-4c47-9a0e-3b8d6f1e2a47",
      headers={"Authorization": "Bearer " + os.environ["NEXIO_API_KEY"]},
      timeout=30,
  )
  response.raise_for_status()
  body = response.json()
  for edge in body["edges"]:
      print(edge["kind"], edge["target"], edge["evidence"]["statement"])
  ```

  ```typescript TypeScript theme={null}
  const response = await fetch(
    "https://api.usenexio.com/api/v1/graph/connection/5f0c9a52-1d2b-4c47-9a0e-3b8d6f1e2a47",
    { headers: { Authorization: `Bearer ${process.env.NEXIO_API_KEY}` } },
  );
  if (!response.ok) throw new Error(`graph read failed: ${response.status}`);
  const body = await response.json();
  for (const edge of body.edges) console.log(edge.kind, edge.target, edge.evidence.statement);
  ```
</CodeGroup>

```json 200 OK theme={null}
{
  "org": { "id": "0b7d4c1e-6a2f-4e8b-9d3c-5f1a2b3c4d5e" },
  "node": {
    "kind": "connection",
    "key": "connection:5f0c9a52-1d2b-4c47-9a0e-3b8d6f1e2a47",
    "label": "Harbor Group warehouse",
    "summary": "Customer Snowflake warehouse",
    "lane": "sources",
    "counts": {},
    "freshness": "2026-09-23T06:00:12.000Z",
    "status": "ACTIVE",
    "expandable": false
  },
  "edges": [
    {
      "id": "feeds:connection:5f0c9a52-1d2b-4c47-9a0e-3b8d6f1e2a47->derivation:book.curated",
      "source": "connection:5f0c9a52-1d2b-4c47-9a0e-3b8d6f1e2a47",
      "target": "derivation:book.curated",
      "kind": "feeds",
      "evidence": {
        "statement": "An active retained publication schedule authorizes this derivation on this connection."
      },
      "observed": false
    }
  ],
  "generatedAt": "2026-09-23T14:02:11.482Z"
}
```

## Errors

| Status | Code                      | Cause                                                                                               |
| ------ | ------------------------- | --------------------------------------------------------------------------------------------------- |
| 400    | `invalid_request`         | The node kind is unknown, or (on the single-node route) the key does not match that kind's grammar. |
| 400    | `unsupported_node_type`   | The kind is `document` or `warehouse_table`, which the API does not serve.                          |
| 401    | `unauthorized`            | Missing or invalid API key.                                                                         |
| 403    | `scoped_key_required`     | A sandbox or test organization key. Use the live key or a scoped key.                               |
| 403    | `insufficient_capability` | A scoped key without `graph:read`.                                                                  |
| 404    | `not_found`               | The graph holds no node with that key.                                                              |
| 500    | `internal_error`          | The graph could not be assembled. Retry.                                                            |

## Next

<CardGroup cols={2}>
  <Card title="Connections" href="/connections/overview">What a connection is and how Nexio configures one.</Card>
  <Card title="Get the whole graph" href="/api-reference/graph/get-graph">Endpoint reference.</Card>
</CardGroup>
