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

> ## Agent Instructions
> Start with /introduction/getting-started. Use the Direct Query API (POST /query) with the Newton Fusion model (text, image, and video reasoning) or the Newton Omega encoder (time-series embeddings). ATAI_API_ENDPOINT must include the version path: /v0.5 for most APIs, /v0.6 for the Fine-Tuning Service. Pages whose descriptions are marked (Archived) document the legacy Lens runtime — do not use them for new projects.

# List Node Registry

> List the nodes available for building blueprints

<Callout icon="clock" color="#3064E3" iconType="solid">
  Requires [version 1.1.9](/release-notes/1.1.x#v1-1-9) or later of the Archetype platform.
</Callout>

## Overview

This endpoint returns the nodes available in the configured `agent_core` registry, split into `connectors` (sources and sinks) and `nodes` (everything else). Each list is sorted by node key.

Use it to discover the node `key` values a blueprint's `connectors`/`nodes` maps can reference, along with each node's port contract, config schema, and default config.

## Request

This endpoint takes no parameters.

## Response

<ResponseField name="connectors" type="array" required>
  Registered source/sink nodes, sorted by node key.
</ResponseField>

<ResponseField name="nodes" type="array" required>
  Every other registered node, sorted by node key.
</ResponseField>

### Node object

<ResponseField name="key" type="string" required>
  The node key referenced from a blueprint's `connectors`/`nodes`.
</ResponseField>

<ResponseField name="description" type="string" required>
  Description of the node.
</ResponseField>

<ResponseField name="contract" type="object" required>
  The node's input and output ports (sorted by port name).
</ResponseField>

<ResponseField name="contract.inputs" type="array" required>
  Input ports, each with a `name` and a `type`.
</ResponseField>

<ResponseField name="contract.outputs" type="array" required>
  Output ports, each with a `name` and a `type`.
</ResponseField>

<ResponseField name="config_schema" type="object" required>
  JSON Schema for the node's config (`{}` when the node takes no config).
</ResponseField>

<ResponseField name="default_config" type="object" required>
  The node's default config as a JSON object.
</ResponseField>

### Port object

<ResponseField name="name" type="string" required>
  Name of the port.
</ResponseField>

<ResponseField name="type" type="string" required>
  The port's data type, e.g. `Record` or `Window`.
</ResponseField>

<RequestExample>
  ```bash cURL theme={"system"}
  curl "$ATAI_API_URL/agents/nodes/registry" \
    -H "Authorization: Bearer $ATAI_API_KEY"
  ```

  ```python Python theme={"system"}
  import os
  import requests

  base_url = os.environ["ATAI_API_URL"]
  api_key = os.environ["ATAI_API_KEY"]

  response = requests.get(
      f"{base_url}/agents/nodes/registry",
      headers={"Authorization": f"Bearer {api_key}"},
  )

  registry = response.json()

  for section in ("connectors", "nodes"):
      print(f"{section}:")
      for node in registry[section]:
          inputs = ", ".join(p["name"] for p in node["contract"]["inputs"]) or "-"
          outputs = ", ".join(p["name"] for p in node["contract"]["outputs"]) or "-"
          print(f"  {node['key']}: in=[{inputs}] out=[{outputs}]")
  ```

  ```javascript JavaScript theme={"system"}
  const response = await fetch(`${process.env.ATAI_API_URL}/agents/nodes/registry`, {
    headers: {
      'Authorization': `Bearer ${process.env.ATAI_API_KEY}`
    }
  });

  const registry = await response.json();

  ['connectors', 'nodes'].forEach(section => {
    console.log(`${section}:`);
    registry[section].forEach(node => {
      const inputs = node.contract.inputs.map(p => p.name).join(', ') || '-';
      const outputs = node.contract.outputs.map(p => p.name).join(', ') || '-';
      console.log(`  ${node.key}: in=[${inputs}] out=[${outputs}]`);
    });
  });
  ```
</RequestExample>

<ResponseExample>
  ```json 200 - Success theme={"system"}
  {
    "connectors": [
      {
        "key": "<connector_key>",
        "description": "Reads records from an external data ref.",
        "contract": {
          "inputs": [],
          "outputs": [
            {"name": "out", "type": "Record"}
          ]
        },
        "config_schema": {},
        "default_config": {}
      }
    ],
    "nodes": [
      {
        "key": "<node_key>",
        "description": "Groups records into windows.",
        "contract": {
          "inputs": [
            {"name": "in", "type": "Record"}
          ],
          "outputs": [
            {"name": "out", "type": "Window"}
          ]
        },
        "config_schema": {
          "type": "object",
          "properties": {}
        },
        "default_config": {}
      }
    ]
  }
  ```
</ResponseExample>

## Important Notes

<Note>
  * A blueprint document must place each entry in the right section: connectors under `connectors`, everything else under `nodes`. Registration validates this.
  * `config_schema` is `{}` when a node takes no config.
  * Port `type` values (e.g. `Record`, `Window`) determine which nodes can be wired together in a blueprint's `graph.edges`.
</Note>
