# Inputs and outputs

> Inputs let one workflow run for many cases, such as a report for any client. Outputs are what it hands back to a workflow that runs it.

Web page: https://docs.lodol.com/docs/concepts/inputs-and-outputs

An **input** is a value a workflow asks for when it starts, so the same workflow can run for different cases: a monthly report that takes the client and the month, or an onboarding workflow that takes the new hire's email. An **output** is a value a workflow hands back when it finishes, for the workflow that ran it.

Inputs are for workflows you [run on demand](https://docs.lodol.com/docs/concepts/triggers.md#on-demand). A workflow with a trigger or a schedule takes no inputs: its event, or its steps, provide everything it needs.

## Declaring inputs

Each input has a name, a type, and whether every run must give it a value:

| Setting | What it means |
| --- | --- |
| Name | What steps call it, and what callers pass the value under, such as `client` |
| Type | `text`, `number`, `boolean`, `list` or `object` |
| Required | Whether every run must be given a value |
| Default | The value an optional input takes when a run leaves it out |
| Description | What the input is for, shown to whoever runs the workflow |

Steps read an input's value with an `@` reference, like any other value.

## Giving inputs a value

Whoever starts the run supplies the values:

- **You**, when you run the workflow in Lodol
- **Your code**, in the body of an API call: `{"inputs": {"client": "Acme", "month": "2026-05"}}`. See [Run a workflow](https://docs.lodol.com/docs/api/runs.md#run-a-workflow).
- **Another workflow**, in its [Run a workflow](https://docs.lodol.com/docs/guides/sub-workflows.md) step
- **An AI agent**, when the workflow is one of its [tools](https://docs.lodol.com/docs/guides/ai-agents.md#tools): the agent fills in the inputs itself

Values are converted to each input's type where they can be: `"21"` becomes the number 21, `"yes"` becomes `true`, and `"a, b"` becomes a list. A value that can't be converted, a missing required input, or a name the workflow doesn't declare stops the run before it starts, with a message naming the input.

## Outputs

A workflow can declare outputs: the values it hands back when it finishes. When another workflow runs it with a **Run a workflow** step, that step's result has one field per output, so later steps read them like any step's result. This is how you build a small workflow once, such as "look up a customer", and reuse it in many others.

Your code gets them the same way: a run started through the API has them in its `outputs` once it succeeds. See [Get a run](https://docs.lodol.com/docs/api/runs.md#get-a-run).

## Next

<Cards>
  <Card title="Run a workflow from another" description="Reuse a workflow as a step, with its inputs and outputs." href="/docs/guides/sub-workflows" />
  <Card title="Runs" description="What happens each time a workflow runs." href="/docs/concepts/runs" />
</Cards>
