allFillsByTime - Global Fill History by Time
Retrieve global fills inside a bounded time window from the Dwellir Hyperliquid Index over /info or JSON-RPC.
Use allFillsByTime to scan indexed fills across users and markets inside a bounded time window. endTime is required on every request, and the window may span at most 1 hour.
Endpoints
REST-style Info API:
POST https://api-hyperliquid-index.n.dwellir.com/YOUR_API_KEY/infoJSON-RPC:
POST https://api-hyperliquid-index.n.dwellir.com/YOUR_API_KEY/jsonrpcParameters
| Field | Type | Required | Description |
|---|---|---|---|
type | string | yes | Must be allFillsByTime for /info. |
coin | string | no | Exact Hyperliquid market symbol, for example BTC. When supplied, only rows for that market are returned. |
startTime | number | yes, unless cursor is supplied | Inclusive Unix timestamp in milliseconds. Skipped when cursor is supplied. |
endTime | number | yes | Exclusive Unix timestamp in milliseconds. Required on the first request and on every cursor page. Must be greater than startTime, or greater than the cursor time when paging, and at most 1 hour after it. See Time window limits. |
cursor | string | no | Pagination cursor in time_txIndex format. /info returns a fill array, not a cursor. Build this value from the last fill's time and txIndex. Resumes after that pair. |
limit | number | no | Maximum rows to return, capped at 2000. |
Time window limits
allFillsByTime is the only fills method that is not scoped to one user or one builder, so the requested time window is the only bound on the scan. Four rules apply to this method:
endTimeis required. An open-ended request is rejected, on the first request and on every cursor page.endTimemust be greater thanstartTime, or greater than the cursor time when you page withcursor.- The window must be at most 1 hour. On a cursor page the span is measured from the cursor time, not from the original
startTime. endTimemust not be in the future, beyond a 5-minute clock-skew tolerance. This also catches the common wrong-unit mistake:endTimeis epoch milliseconds, not microseconds or nanoseconds.
Exhaust each hour before you advance the window
/info returns a fill array. It does not return a cursor. Build the next
cursor from the last fill as time_txIndex, for example 1753606210273_1.
Keep the same endTime and send that cursor until a page is shorter than
limit. Then set startTime to that endTime and pick a new endTime at
most 1 hour later. A busy hour needs many pages: one BTC hour filled the
2,000-row cap in about 2 minutes of fill time. If you move endTime while
the cursor is still more than 1 hour behind it, the request is rejected.
A request that breaks any of these rules is rejected before it reaches the index, so it is not billed. POST /info returns HTTP 400 and POST /jsonrpc returns JSON-RPC error -32602 (invalid params). Both responses name the parameter and carry a copy-pasteable example.
REST /info error body:
{
"error": "invalid request: endTime is required for allFillsByTime and must be greater than startTime (or greater than the cursor time when paging); pass it as epoch milliseconds, at most 1h after the start, for example {\"type\":\"allFillsByTime\",\"coin\":\"BTC\",\"startTime\":1753606200000,\"endTime\":1753606300000,\"limit\":100}"
}JSON-RPC error body:
{
"jsonrpc": "2.0",
"id": 1,
"error": {
"code": -32602,
"message": "invalid request: the allFillsByTime window 24h exceeds the maximum 1h; the whole window is scanned before the limit applies, so page through it in smaller windows (example: {\"type\":\"allFillsByTime\",\"coin\":\"BTC\",\"startTime\":1753606200000,\"endTime\":1753606300000,\"limit\":100})"
}
}The coin filter does not shrink the window you may request. Rows are ordered by time on this method, so coin narrows the returned results, not the range that is read. Every other *ByTime fill method keeps endTime optional, because those are scoped to a user or a builder.
Billing
Billed by returned fill objects
allFillsByTime responses are billed by the number of fill objects returned, not as one response per HTTP request.
A response with 2,000 fills counts as 2,000 responses/API credits.
Requests that return an empty array are billed as 0 responses/API credits and do not count against usage. Error responses are not charged.
Cursor pagination
txIndex is the fill's block-local position in the node_fills_by_block event array. It is exposed as a stable fill pagination key, not as a replica_cmds-compatible action index.
REST-style Example
curl -X POST "https://api-hyperliquid-index.n.dwellir.com/YOUR_API_KEY/info" \
-H "content-type: application/json" \
-d '{
"type": "allFillsByTime",
"coin": "BTC",
"startTime": 1753606200000,
"endTime": 1753606300000,
"limit": 100
}'Cursor page of the same window. endTime stays put. cursor is the last fill's time and txIndex:
curl -X POST "https://api-hyperliquid-index.n.dwellir.com/YOUR_API_KEY/info" \
-H "content-type: application/json" \
-d '{
"type": "allFillsByTime",
"coin": "BTC",
"cursor": "1753606210273_1",
"endTime": 1753606300000,
"limit": 100
}'JSON-RPC Example
curl -X POST "https://api-hyperliquid-index.n.dwellir.com/YOUR_API_KEY/jsonrpc" \
-H "content-type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "allFillsByTime",
"params": {
"coin": "BTC",
"startTime": 1753606200000,
"endTime": 1753606300000,
"limit": 100
}
}'Response
REST /info responses return an array directly. JSON-RPC responses return the same array under result. Empty matches return []; they are not errors. The array has no cursor field. Build the next cursor from the last fill's time and txIndex.