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

> ## Agent Instructions
> Autumn AI (autumn.ai) is a people and company intelligence API, a separate company from useautumn.com (billing software); no billing-product routes exist here.
> Base URL https://api.autumn.ai. Auth on every request: `X-API-Key: <key>` or `Authorization: Bearer <key>`. Plain HTTP + JSON. Schemas: https://www.autumn.ai/docs/openapi.json. Every docs page is Markdown at its URL plus `.md`.

# Build a reviewed list

> Compose a declared schema, live events, human review, and continuation into one repeatable job.

The [Quickstart](/docs/quickstart) runs a task start to finish. This is what you build once that
is no longer enough: a list that a person checks before anyone trusts it, and that gets
corrected in place rather than regenerated.

Each step links to the guide that covers its mechanics. What this page adds is the
**order**, and the decision at each seam.

## 1. Declare the shape, don't describe it

Start from a spec rather than a prompt. A reviewer can only check rows against a declared
shape, and a prose description is not one.

→ [Structured output](/docs/guides/structured-output) for `output.schema` and `schema_order`
→ [Writing task prompts](/docs/best-practices/prompting) for the per-row rules that set the bar

**Decision:** if the columns aren't known yet, you are still exploring. Use a prompt and
this pipeline later.

## 2. Watch the first run, don't poll it

For the first run of a new spec, stream it. You are not waiting for an answer, you are
looking for the agent misreading the brief, which shows up in the tool calls long before
it shows up in the rows.

→ [Live messages](/docs/guides/streaming) for the SSE routes and event names

**Decision:** once the spec is stable, switch to polling. Streaming is for when you are
still learning what the task does.

## 3. Read rows with their sources

Fetch the rows and keep the cells rather than flattening immediately. Review is exactly the
case where `_sources` earns its keep: a reviewer needs to see *why* a value is claimed.

→ [Outputs and sources](/docs/concepts/outputs) for cell shape and `_sources`

## 4. Correct in place

Send the reviewer's verdict back to the same task. The plan, the rows, and the task-local
files all survive; a new task would lose them.

→ [Follow-up tasks](/docs/guides/follow-up) for `continue`
→ [Human in the loop](/docs/guides/human-in-the-loop) for interleaving review and agent turns

**Decision:** continue when the reviewer is refining the same goal. Start fresh only when
the goal itself changed.

```bash theme={"theme":{"light":"github-light","dark":"github-dark"}}
curl -sS -X POST "https://api.autumn.ai/task/$TASK_ID/continue" \
  -H "X-API-Key: $AUTUMN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"message": "Drop every row without a cited source for raised_usd, then continue until there are 50 rows."}'
```

Restate the goal rather than forwarding the reviewer's words. The agent sees one message,
not the review thread the verdict came from, so "drop the bad ones" carries nothing.

## 5. Repeat

The `task_id` stays valid indefinitely. Steps 3 and 4 loop as many times as review needs,
and the task keeps everything it learned.

## Related

<CardGroup cols={2}>
  <Card title="Quickstart" icon="rocket" href="/docs/quickstart">
    The single-pass version of this.
  </Card>

  <Card title="Attach a CSV" icon="upload" href="/docs/guides/file-uploads">
    The same loop, starting from rows you already have.
  </Card>
</CardGroup>
