---
title: Data Store
description: Remember values between workflow runs
---

Remember values from one run of a workflow to the next.

## Try it

## What it does

Every other node starts each run knowing nothing. Data Store keeps named values (keys) that survive between runs, so "only tell me what changed", "carry on from the page I stopped at" and "stop after N calls" become possible. Pick one of six **Operation** choices:

* **Get**: read a key.
* **Set**: store **Value** under a key, replacing what was there.
* **Delete**: remove a key.
* **Increment**: add **Increment By** to a number. A key that does not exist yet starts at `0`, so a counter needs no setup step.
* **List keys**: return every key in the current scope.
* **Clear all**: remove every key in the current scope.

**Scope** decides who sees the keys. *This workflow only* (the default) keeps them private to this workflow. *Shared with all workflows* lets every workflow you own read and overwrite them.

Values are stored in this browser profile and work without an account. Nothing is sent anywhere: the same workflow on another device has its own separate store, and clearing the extension's data clears these entries too.

## When to use it

* Keep the last-seen ID or timestamp so a watcher only reports new items.
* Save a page cursor to resume a paginated source on the next run.
* Count calls across runs, for example to stop after 100 requests a day.
* Share one setting between several workflows with the shared scope.

To remove duplicates across runs without building it yourself, [Remove Duplicates](/nodes/builtin/datatransformation/removeduplicates/) already uses the Data Store. For values that only matter during one run, use [Set Variable](/nodes/builtin/flow/setvariable/).

## Inputs and settings

* **Key** is needed by every operation except **List keys** and **Clear all**. Up to 512 characters.
* **Value Format** only applies to text typed into **Value**. A value that comes from an expression, such as `{{ $input.id }}`, is stored as it already is (a number stays a number, an object stays an object).
* Limits per scope: 500 keys, 128 KB per value, 5 MB in total. Nothing is ever removed to make room; the node fails with a message instead.

## Outputs

The output depends on the operation:

* **Get**: `{ key, found, value }`. `found` tells a missing key apart from a stored `null`; branch on `found`, not on `value`.
* **Set**: `{ key, value }` with the stored value.
* **Delete**: `{ key, deleted }`, where `deleted` says whether there was a value to remove.
* **Increment**: `{ key, value }` with the new total.
* **List keys**: one item per key, each `{ key, value, lastModified }`.
* **Clear all**: `{ cleared }`, the number of keys removed.

### Seeing stored values from the canvas

Open the **Stored data** tab in the canvas side panel, with the database button in the canvas controls or **View stored values** in a Data Store node's settings. It lists every key this workflow stored, with its value, type and last change, and lets you **Delete** one key or **Clear all** (useful to make a watcher alert again). It refreshes after each run and has a refresh button for background runs. It appears once the workflow is saved and has a Data Store node, or still has stored keys.

Keys in the shared scope are managed in **Settings → Preferences → Data store**, where you can also view and clear all stored values.

## Dependencies and credentials

None. This node needs no connection and has no slots for other nodes.

## Example workflow

Get notified only when an API returns a new latest item:

1. [Schedule](/nodes/builtin/trigger/schedule/) trigger, every hour.
2. [Http Request](/nodes/builtin/core/http-request/), **GET** `https://api.example.com/latest`.
3. Data Store, **Operation** Get, **Key** `last-seen-id`.
4. [IF](/nodes/builtin/flow/if/): `{{ $('Http Request').data.id }}` is not equal to `{{ $input.value }}`.
5. On true: [Browser Notification](/nodes/extension/browsernotification/), then Data Store, **Operation** Set, **Key** `last-seen-id`, **Value** `{{ $('Http Request').data.id }}`.

## Common issues

* **"The get operation needs a key."** (or set, delete, increment). **Key** is empty or only spaces. Fill it in.
* **"This node is scoped to the current workflow but no workflow is running."** You tested the node on its own. Run the whole workflow, or switch **Scope** to *Shared with all workflows*.
* **"Value "…" is not a number. Change the value, or the value format."** **Value Format** is *Number* (or *True / false*, or *JSON*) but the typed text does not match. Fix the text or pick *Text*.
* **"This store already holds 500 keys, the maximum allowed."** or a byte-limit message. Delete keys you no longer need, from the **Stored data** tab or with **Delete**.
* **An imported or copied workflow does not see the old keys.** Keys in *This workflow only* belong to the original workflow. Use the shared scope for values several workflows must read.

## Recipes with this node

## Related nodes

* [Remove Duplicates](/nodes/builtin/datatransformation/removeduplicates/): skip items already seen in earlier runs.
* [Set Variable](/nodes/builtin/flow/setvariable/): keep a value for the current run only.
* [IF](/nodes/builtin/flow/if/): branch on what you read back.
* [Execution Data](/nodes/builtin/core/execution-data/): read details about the current run.