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

# Data Structure

> How Runchat stores items, lists, and objects internally as flat arrays, and how to control list behaviour with depth across multi-input workflows.

Runchat works with three data shapes: **items**, **lists**, and **objects**. All parameter data is stored internally as flat arrays, which keeps data flow simple and predictable.

## Items

A single value, like one piece of text or one image URL. When you type into a node's input form, you're setting one item per parameter. Internally Runchat stores it as an array with a single element.

## Lists

More than one value in the same parameter. You can create a list by:

* Clicking the `+` button on an Input node to add additional values
* Setting an Agent node's output format to **list**
* Returning an array from a Code node
* Receiving a list back from an API

When a parameter holds a list, the node shows pagination controls so you can step through inputs and outputs.

## Objects

JSON objects describe things using key-value pairs. They're heavily used by language models, third-party APIs (YouTube, Maps, etc.), and anywhere structured data needs to flow between nodes. Object values can themselves be lists, nested objects, or any other type.

```json theme={null}
{
  "title": "Pavilion concept",
  "materials": ["concrete", "glass"],
  "rooms": {
    "count": 4
  }
}
```

## How data flows between nodes

When a node runs, Runchat collects the data from each input parameter (always as an array) and passes it to the node's calculation function. If a parameter has multiple items, the node processes each one and returns a matching list of outputs.

You control how lists are processed at each input using **depth**, set on the parameter connection. Depth determines whether items are processed individually, processed all at once, or flattened from nested arrays. See [Data Matching](/concepts/data/data-matching) for the full behaviour.

## Next steps

* [Data Matching](/concepts/data/data-matching): how depth, "each", and "all" control list behaviour across multiple inputs
* [Data Types](/concepts/data/data-types): the type each value carries and how casting works
* [Loops](/concepts/data/loops): pass output back upstream for recursive workflows
