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

# Extend a Demo Storefront and choose its sample sources

> Set a Demo Storefront's expiry and sample sources with the demo field on save_seller, and read them back with get.

A Demo Storefront is a Seller Account's time-limited stand-in made of synthetic
sample inventory. You extend it and choose which sample sources it carries with
one field on `save_seller`: `demo`. A Scope3 platform administrator creates a
Demo Storefront. You reset or delete one from the Demo Storefront Page. It is a
different control from the [intake hold](https://docs.apostra.com/v3/seller-intake-hold.md), which stops
new buyer business on a live Seller Account.

`get` with `kind: "seller"` returns the current state as `demo.expiresAt` and
`demo.sourceRecipeIds`, beside the Demo Storefront's `status` and `disclosure`.
A Seller Account with no Demo Storefront has no `demo` object.

## Extend the Demo Storefront

Send `demo.expiresAt`, the instant you want the Demo Storefront to expire.

```json theme={null}
{
  "demo": { "expiresAt": "2026-11-10T12:00:00Z" }
}
```

| Rule | What it means |
| - | - |
| Later than now and the current expiry | A Demo Storefront is only ever extended. To end one, delete it from the Demo Storefront Page. |
| At most seven days past that | The limit is measured from the later of the current expiry and now, so an expired Demo Storefront can be extended to seven days from now. Extend again for longer. |
| Already that expiry | The call succeeds and changes nothing; the result reports `unchanged`. |

A request that is a few minutes beyond the seven-day limit, because your clock
runs ahead of ours, is held to the limit. Read `demo.expiresAt` in the result
for the instant that was saved.

## Choose the sample sources

Send `demo.sourceRecipeIds`, the complete set of sample sources you want.

```json theme={null}
{
  "demo": {
    "sourceRecipeIds": ["sample-publisher-display", "sample-publisher-ctv"]
  }
}
```

The three sample sources are `sample-publisher-display`, `sample-publisher-ctv`
and `sample-retail-media`. The Demo Storefront gains the ones it lacks and drops
the optional ones you leave out, with the products they generated. The set must
list each source once and must keep `sample-publisher-display`, which supplies
the sample brief; a set without it is refused with `VALIDATION_ERROR`.

To add one source, read `demo.sourceRecipeIds`, add it, and send the whole set.

## Rules

* **Send `demo` alone.** It changes the Demo Storefront, not the Seller
  Account's own configuration. `demo` together with any other `save_seller`
  field is refused with [`VALIDATION_ERROR`](https://docs.apostra.com/v3/errors).
* **You need the same access as for the Demo Storefront Page.** A Seller Account
  with no Demo Storefront and no modular-source entitlement is refused with
  `FEATURE_NOT_ENABLED`, and one with no Demo Storefront is `NOT_FOUND`.
  A Demo Storefront that is being deleted is refused with `CONFLICT`. So is a
  sources change made from sources that have since changed, for example by
  another save at the same moment: read `demo.sourceRecipeIds` again and retry.
* **`expiresAt` and `sourceRecipeIds` can be sent together.** The expiry is
  saved first. If the sources are then refused, the error says the expiry was
  saved, and you retry with only the sources.
* **The `write` role is required**, the same role `save_seller` needs for every
  other change.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.