# Replay

Read content up to an action or publication time.

Source: [Replay](/replay/)

Add `atAction`, `asOf`, or both to the feed route. The response is still a complete snapshot for that selected point and retains the same delivery order.

| Parameter  | Selection                                                     | Valid value                                                       |
| ---------- | ------------------------------------------------------------- | ----------------------------------------------------------------- |
| `atAction` | Keep items with `content.actionNumber` at or below the bound. | Digits only, one to nine digits: 0 through 999999999.             |
| `asOf`     | Keep item revisions published at or before the bound.         | RFC 3339 date-time with timezone, such as `2026-06-04T03:00:00Z`. |

Both bounds must hold when supplied together. Send each parameter at most once. Encode a timezone `+` as `%2B`, or let your HTTP client encode it:

```bash
curl --fail-with-body --silent --show-error --get \
  --data-urlencode 'atAction=300' \
  --data-urlencode 'asOf=2026-06-04T03:00:00+00:00' \
  'https://api.live.storyos.ai/v1/fixtures/0042500401/feeds/pulse'
```

## Public samples [#public-samples]

The twelve listed samples filter their bundled items. `snapshotAt` is the newest retained item’s `publishedAt`. With no items left, it is the fixture’s `firstEventAt`, or the requested `asOf` when that is earlier.

## Portland’s retained snapshot [#portlands-retained-snapshot]

Fixture `0022501147` rejects both replay parameters with `400`. It contains only each item’s latest revision, so a time filter would misrepresent earlier content. Read its unfiltered snapshot to explore version 1 types.

## Live feeds [#live-feeds]

A live game's read always uses its live feed. When replay bounds are supplied, each item uses its latest accepted published revision that satisfies both bounds. Items missing `content.actionNumber` are excluded by `atAction`. Withdrawn items stay absent even for earlier bounds.

For a nonempty replay, `snapshotAt` is the newest retained revision’s `publishedAt`. For an empty replay, it is the live feed’s creation time, or the requested `asOf` when earlier. Without replay, it is the latest commit time.

## Validation and caching [#validation-and-caching]

Invalid, repeated or out-of-range values return `400`. Unknown query parameters are ignored. Each filtered response has its own ETag; keep it separate from the unfiltered response and other bounds.
