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

# Storage: Exists in storage

> Checks if the value is present in storage.

export const FormField = ({property, label, required = false, diType, uiPatterns, children}) => {
  const patterns = Array.isArray(uiPatterns) ? uiPatterns : uiPatterns ? [uiPatterns] : [];
  return <div style={{
    margin: '1.5rem 0'
  }}>
      <div style={{
    display: 'flex',
    alignItems: 'baseline',
    flexWrap: 'wrap',
    gap: '0.5rem',
    marginBottom: '0.25rem'
  }}>
        <strong>{label}</strong>
        <span style={{
    fontSize: '0.7rem',
    fontWeight: 600,
    textTransform: 'uppercase',
    letterSpacing: '0.04em',
    color: required ? '#6241f5' : '#6b7280'
  }}>
          {required ? 'Required' : 'Optional'}
        </span>
      </div>

      <div>{children}</div>

      {diType || patterns.length > 0 ? <p style={{
    fontSize: '0.85rem',
    color: '#6b7280',
    marginBottom: 0
  }}>
          {diType ? <>
              See the <a href={`/references/${diType}`}>{diType}</a> reference.{' '}
            </> : null}
          {patterns.length > 0 ? <>
              Accepts a <a href={`/documentation/placeholders-and-patterns/patterns#${patterns[0]}`}>pattern</a>.
            </> : null}
        </p> : null}
    </div>;
};

Checks whether the incoming value can be found in a storage you set up earlier. A storage is a place where Alumio keeps data between steps or runs, such as a list of identifiers you saved on a previous run. The condition goes through the items in the chosen storage and answers yes as soon as one of them matches the incoming value. Use this to act only on records you have already seen or already saved, for example to skip products that are already known, or to pick out the ones that are new. The Pattern lets you compare against a specific part of each stored item rather than the whole item, and the Comparator decides how the two values are compared.

This documentation describes: [Schema](/schemas/condition/in-storage)

## Fields

<FormField property="storage" label="Storage" required diType="storage">
  The storage to look in. You select a storage that was set up beforehand; its items are the values the incoming value is compared against.
</FormField>

<FormField property="pattern" label="Pattern" required>
  Which part of each stored item to compare against, written as a path into the item. Defaults to `@`, meaning the whole stored item. Set it to a path such as `sku` to compare against only that field of each stored item instead of the entire item.
</FormField>

<FormField property="comparator" label="Comparator" diType="comparator">
  How the incoming value and the stored value are compared, for example an exact match. When left empty, an exact equality check is used.
</FormField>

## Sample data

This condition reads from a configured storage backend, so what it matches depends on the items already saved there rather than on a fixed before and after. The example below looks in a storage of known products and, for each stored item, compares its `sku` field against the incoming value. The incoming value matches when a product with that SKU is already in the storage.

| Field      | Value                       |
| ---------- | --------------------------- |
| Storage    | A storage set up beforehand |
| Pattern    | `sku`                       |
| Comparator | Exact match (default)       |

```json Configuration theme={null}
{
  "prototype": "in-storage",
  "parameters": {
    "storage": { "prototype": "storage", "parameters": {} },
    "pattern": "sku"
  }
}
```
