# ListFeeds - Discover V3 Raw Feeds

`ListFeeds` returns the V3 raw block-envelope feeds available on the selected endpoint. Call it during startup or capability refresh instead of assuming that every declared raw RPC is available.

## Method signature

```protobuf
rpc ListFeeds(ListFeedsRequest) returns (ListFeedsResponse) {}
```

The authenticated request has no parameters:

```bash
grpcurl -format json \
  -proto v3.proto \
  -H "x-api-key: ${DWELLIR_API_KEY}" \
  -d '{}' \
  "${HYPERLIQUID_GRPC_ENDPOINT}" \
  hyperliquid_l1_gateway.v3.HyperliquidL1Gateway/ListFeeds
```

## Request Parameters

This method accepts no parameters.

## Request Example

```bash
grpcurl -format json \
  -proto v3.proto \
  -H "x-api-key: ${DWELLIR_API_KEY}" \
  -d '{}' \
  "${HYPERLIQUID_GRPC_ENDPOINT}" \
  hyperliquid_l1_gateway.v3.HyperliquidL1Gateway/ListFeeds
```

## Response Fields

- `feeds` (`FeedInfo[], required`): Raw block-envelope feeds available on this endpoint.
- `feeds.id` (`string, required`): Stable feed identifier.
- `feeds.source` (`string, required`): Stable source identifier for the feed.
- `feeds.position_kinds` (`PositionKind[], required`): Cursor kinds accepted by this feed.
- `feeds.filter_fields` (`string[], required`): Valid FieldFilter names; empty means filtering is not supported.

## Successful Response

```protobuf
feeds: {
  id: "blocks"
  source: "replica_cmds"
  position_kinds: POSITION_KIND_TIMESTAMP
  position_kinds: POSITION_KIND_BLOCK_NUMBER
}
feeds: {
  id: "fills"
  source: "node_fills_by_block"
  position_kinds: POSITION_KIND_TIMESTAMP
  position_kinds: POSITION_KIND_BLOCK_NUMBER
  filter_fields: "users"
  filter_fields: "coins"
}
feeds: {
  id: "misc-events"
  source: "misc_events_by_block"
  position_kinds: POSITION_KIND_TIMESTAMP
  position_kinds: POSITION_KIND_BLOCK_NUMBER
  filter_fields: "users"
}
feeds: {
  id: "order-statuses"
  source: "node_order_statuses_by_block"
  position_kinds: POSITION_KIND_TIMESTAMP
  position_kinds: POSITION_KIND_BLOCK_NUMBER
  filter_fields: "users"
  filter_fields: "coins"
}
feeds: {
  id: "raw-book-diffs"
  source: "node_raw_book_diffs_by_block"
  position_kinds: POSITION_KIND_TIMESTAMP
  position_kinds: POSITION_KIND_BLOCK_NUMBER
  filter_fields: "users"
  filter_fields: "coins"
}
feeds: {
  id: "twap-statuses"
  source: "node_twap_statuses_by_block"
  position_kinds: POSITION_KIND_TIMESTAMP
  position_kinds: POSITION_KIND_BLOCK_NUMBER
  filter_fields: "users"
  filter_fields: "coins"
}
```

## Error Responses

### Unauthenticated

- Code: `UNAUTHENTICATED`
- Description: The request did not include usable authentication metadata.

### Permission denied

- Code: `PERMISSION_DENIED`
- Description: The supplied credential is not permitted to call the service.

## Current feed inventory

A typical response lists these six raw feeds:

```protobuf
feeds: {
  id: "blocks"
  source: "replica_cmds"
  position_kinds: POSITION_KIND_TIMESTAMP
  position_kinds: POSITION_KIND_BLOCK_NUMBER
}
feeds: {
  id: "fills"
  source: "node_fills_by_block"
  position_kinds: POSITION_KIND_TIMESTAMP
  position_kinds: POSITION_KIND_BLOCK_NUMBER
  filter_fields: "users"
  filter_fields: "coins"
}
feeds: {
  id: "misc-events"
  source: "misc_events_by_block"
  position_kinds: POSITION_KIND_TIMESTAMP
  position_kinds: POSITION_KIND_BLOCK_NUMBER
  filter_fields: "users"
}
feeds: {
  id: "order-statuses"
  source: "node_order_statuses_by_block"
  position_kinds: POSITION_KIND_TIMESTAMP
  position_kinds: POSITION_KIND_BLOCK_NUMBER
  filter_fields: "users"
  filter_fields: "coins"
}
feeds: {
  id: "raw-book-diffs"
  source: "node_raw_book_diffs_by_block"
  position_kinds: POSITION_KIND_TIMESTAMP
  position_kinds: POSITION_KIND_BLOCK_NUMBER
  filter_fields: "users"
  filter_fields: "coins"
}
feeds: {
  id: "twap-statuses"
  source: "node_twap_statuses_by_block"
  position_kinds: POSITION_KIND_TIMESTAMP
  position_kinds: POSITION_KIND_BLOCK_NUMBER
  filter_fields: "users"
  filter_fields: "coins"
}
```

Registries can vary by endpoint. Call `ListFeeds` at runtime and refresh the inventory after changing endpoints.

## Response fields

| Field                    | Meaning                                                                     |
| ------------------------ | --------------------------------------------------------------------------- |
| `feeds[].id`             | Stable feed identifier used by the gateway                                  |
| `feeds[].source`         | Stable source identifier for the feed                                       |
| `feeds[].position_kinds` | Cursor kinds accepted by that feed                                          |
| `feeds[].filter_fields`  | Valid V3 `FieldFilter.field` values; empty means the feed is not filterable |

Order-book snapshots are intentionally outside the registry because they are generated from periodic ABCI state rather than exposed as a block-envelope feed. `StreamOrderbookSnapshots` and `GetOrderbookSnapshot` are the public methods for accessing them. Snapshot availability and maximum response size vary by endpoint. Oversized responses return `RESOURCE_EXHAUSTED`.

## Errors

- `UNAUTHENTICATED` or `PERMISSION_DENIED` means the request did not include usable credentials.
- Transport failures and `UNAVAILABLE` should be handled with a bounded retry; keep the last known capabilities only if that fallback is acceptable for your application.

See the [gRPC overview](https://www.dwellir.com/docs/hyperliquid/grpc#v3-raw-feed-service) for positioning, filtering, retention, and recovery semantics shared by raw methods.
