---
title: "Replay public whale-trade intelligence events"
method: GET
path: "/api/v1/events/feed/since"
tags: ["Events"]
---

# Replay public whale-trade intelligence events

`GET /api/v1/events/feed/since`

Returns durable public whale-trade intelligence events strictly after an opaque cursor backed by whale_alerts.id. This is a separate API-key contract from the browser/session /api/events/feed stream: browser-only and private alert, following, radar, and position patch events are excluded until they have a durable public outbox.

## Query parameters

- `cursor` string
- `limit` integer

## Response `200`

Public event replay window

- object
  - `object` 'event_replay', required
  - `data` EventReplayEvent[], required
    - `id` string, required — Opaque event ID; currently identical to cursor for the whale_alerts.id sequence.
    - `type` 'whale_trades_inserted', required
    - `cursor` string, required — Cursor positioned at this event.
    - `sequence` integer, required — Global whale_alerts.id sequence.
    - `published_at` string, date-time, required
    - `payload` object, required
    - `source` EventReplaySource, required
      - `kind` 'local_durable_replay', required
      - `producer_family` 'whale_trades', required
      - `owner` 'whale_alerts', required
      - `provider_fetch_at_request_time` false, required
    - `freshness` EventReplayFreshness, required
      - `status` 'observed', required
      - `observed_at` string, date-time, required
  - `has_more` boolean, required
  - `next_cursor` string, required
  - `meta` EventReplayMeta, required
    - `request_id` string, required — Unique request ID (req_ prefix).
    - `cached` boolean, required
    - `cache_age_s` integer, nullable
    - `replay` object, required
      - `from_cursor` string, required
      - `to_cursor` string, required
      - `from_sequence` integer, required
      - `to_sequence` integer, required
      - `ordering` 'whale_alerts_id_asc', required
    - `retention` object, required
      - `status` 'durable_database', required
      - `retained_events` integer, required
      - `cursor_expired` false, required
    - `completeness` object, required
      - `status` 'complete' | 'caught_up', required
      - `reason` string, required

## Other responses

- `400` — Invalid request parameter
- `401` — Missing or invalid API key
- `402` — Active Insider subscription required
- `403` — Account access denied
- `408` — Request exceeded the server's 30-second transport timeout. The timeout response has an empty body because it is generated before handler-level JSON error shaping.
- `423` — Account is locked
- `429` — Rate limit exceeded (100 req/min; batch endpoints also reserve 100 batch item units/min before execution)
- `503` — Redis-backed authenticated rate limiter unavailable; retry after the per-process outage cooldown

## Changes

- **2026-06-01** `422bd4dc1611` — 63 warning, 1 info
  - added the new `account_locked` enum value to the `error/code` response property for the response status `400`
  - added the new `account_locked` enum value to the `error/code` response property for the response status `401`
  - added the new `account_locked` enum value to the `error/code` response property for the response status `402`
  - added the new `account_locked` enum value to the `error/code` response property for the response status `403`
  - …60 more
- **2026-05-08** `80e8658e5acf` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/0xinsider/apis/0xinsider-api/changes/api/v1/events/feed/since/get.md)

---

[API](https://skmtc.dev/0xinsider/apis/0xinsider-api.md) · [All operations](https://skmtc.dev/0xinsider/apis/0xinsider-api/llms.txt) · [OpenAPI document](https://skmtc.dev/0xinsider/apis/0xinsider-api/revisions/137fa0fd3297?raw)
