Skip to content

Paginated GET Action

The getPaginated action provides a type-safe way to handle paginated requests against the Mirror Node API. It automatically handles pagination by following the next links in the response until all pages are retrieved.

Interface

typescript
interface MirrorNodeGetPaginatedParameters<C, P, O, D, R> {
  /** Mirror API client */
  client: C;
  /** API path to paginate */
  path: P;
  /** Query options for initial page */
  options?: O;
  /** Transformation function applied to each page */
  transform?: (page: D) => R;
  /** Retry configuration for failed requests */
  retryOptions?: WithRetryParameters;
}

Parameters

1. Client (client)

The Mirror Node client instance that will be used to make the requests.

2. Path (path)

The API endpoint path to fetch data from. Must be a valid Mirror Node API path that supports pagination.

typescript
type MirrorPath =
  | "/api/v1/accounts"
  | "/api/v1/tokens"
  | "/api/v1/transactions"
  | "/api/v1/balances";
// ... other valid paths

3. Options (options)

Optional query parameters for the initial request. Subsequent requests will use the next link from the response.

typescript
interface MirrorGetOptions<P> {
  params?: {
    path?: {
      [key: string]: string;
    };
    query?: {
      [key: string]: string | number | boolean;
    };
    limit?: number;
    order?: "asc" | "desc";
  };
  headers?: {
    [key: string]: string;
  };
}

4. Transform (transform)

Optional function to transform each page of data before adding it to the results.

typescript
type TransformFunction<ResponseData, ReturnType> = (
  page: ResponseData
) => ReturnType;

5. Retry Options (retryOptions)

Optional configuration for retry behavior on each page request.

typescript
interface WithRetryParameters {
  /** Maximum number of retry attempts */
  maxAttempts?: number;
  /** Delay between retries in milliseconds */
  delay?: number;
  /** Function to determine if retry should be attempted */
  shouldRetry?: (error: Error) => boolean;
}

Usage Examples

Basic Usage

typescript
import { MirrorActions } from "@buidlerlabs/memejob-sdk-js";

const results = await MirrorActions.getPaginated({
  client: mirrorClient,
  path: "/api/v1/tokens",
});

With Query Parameters

typescript
import { MirrorActions } from "@buidlerlabs/memejob-sdk-js";

const results = await MirrorActions.getPaginated({
  client: mirrorClient,
  path: "/api/v1/balances",
  options: {
    params: {
      query: {
        "account.id": "0.0.123456",
        limit: 100,
      },
    },
  },
});

With Path Parameters

typescript
import { MirrorActions } from "@buidlerlabs/memejob-sdk-js";

const results = await MirrorActions.getPaginated({
  client: mirrorClient,
  path: "/api/v1/tokens/{tokenId}/balances",
  options: {
    params: {
      path: {
        tokenId: "0.0.123456",
      },
      query: {
        limit: 100,
      },
    },
  },
});

With Data Transformation

typescript
import { MirrorActions } from "@buidlerlabs/memejob-sdk-js";

const results = await MirrorActions.getPaginated({
  client: mirrorClient,
  path: "/api/v1/balances",
  options: {
    params: {
      query: {
        "account.id": "0.0.123456",
        limit: 100,
      },
    },
  },
  transform: (page) => {
    if (!page) return [];
    return page.balances?.[0].tokens.filter(
      ({ token_id }) => token_id === "0.0.789012"
    );
  },
});

With Retry Configuration

typescript
import { MirrorActions } from "@buidlerlabs/memejob-sdk-js";

const results = await MirrorActions.getPaginated({
  client: mirrorClient,
  path: "/api/v1/tokens",
  retryOptions: {
    maxAttempts: 3,
    delay: 1000,
    shouldRetry: ({ count, error }) => true,
  },
});

Error Handling

The action throws a MirrorNodeError if any page request fails. You can handle specific error types:

typescript
import { MirrorActions, MirrorNodeError } from "@buidlerlabs/memejob-sdk-js";

try {
  const results = await MirrorActions.getPaginated({
    client: mirrorClient,
    path: "/api/v1/tokens",
  });
} catch (error) {
  if (error instanceof MirrorNodeError) {
    console.error("Mirror Node error:", error.message);
  }
}