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

# Dataset refreshes

> Keep dashboard data current with one owned refresh, safe source reads, and predictable update rules.

A dataset refresh is the automation that keeps one dataset current. It belongs
to the dataset itself: when you ask an agent to keep a dashboard fresh, Erdo
configures that dataset's refresh instead of creating a separate job that also
writes to it.

## When refreshes run

* **On view** is the default. A stale dataset refreshes when someone opens the
  page or dashboard that uses it, so it costs nothing while nobody is looking.
* **On a schedule** is for data that must already be current before another
  consumer runs, such as a scheduled report.
* **Live** refreshes use a verified webhook or supported polling source for
  genuinely streaming data.

Only one active execution runs for a dataset refresh at a time. Repeated page
views or manual clicks join the run already in progress instead of starting a
second writer.

## Script or agent

Erdo uses a deterministic script when the source and output shape are known.
That costs **one credit per run** and uses no LLM. An agent-backed refresh is
reserved for work that genuinely needs judgement or extraction on every run.

Deterministic JavaScript refresh recipes can:

* read the existing target or another permitted dataset;
* read public HTTP sources with GET or HEAD;
* call connected-source actions that the integration explicitly declares as
  safe, read-only refresh sources; and
* read saved recipe values from the uppercase `PARAMETERS` object.

They cannot call mutation-capable actions, make POST/PUT/DELETE requests, write
another dataset directly, or call an LLM. The refresh executor owns the single
target write, so approvals cannot accidentally turn a data reader into a second
automation system.

[Experiment](/experiments) measurement recipes retain their dedicated typed
observation and decision-signal primitives. Those platform-owned operations are
not general provider actions or arbitrary dataset writes.

## Replace, upsert, and no changes

* **Replace** applies a complete non-empty result and replaces the stored rows.
* **Upsert** merges a non-empty result using the configured key column or
  composite key.
* Returning an empty array means **no changes** in either mode. It preserves the
  existing dataset; it never clears it.

Use upsert for rolling windows, paged sources, and historical dashboards. Use
replace only when every successful run returns the complete desired dataset.

Every run records its outcome in Activity. Authenticated source calls are also
recorded by app and action name, without storing their input parameters or
returned source data.

## Editing a refresh

Ask an agent to update the dataset refresh, or reconfigure it from the dataset.
The generic automation editor can rename, enable, or disable the schedule, but
it cannot replace refresh instructions or source code: those stay with the
dataset configuration that owns the behavior.

See [Data & Connectors](/data) for datasets and [Automations](/automations) for
other scheduled work.
