> ## Documentation Index
> Fetch the complete documentation index at: https://docs.fetchski-attract.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Paging

> One loop over a whole list, however it pages.

Lists answer a page at a time, and not all of them page the same way. Every list method has an
`…All()` twin that walks it for you: an async iterator that fetches a page as you go and stops after the
last.

```ts theme={"dark"}
for await (const item of site.faqItems().listFaqItemsAll({ perPage: 50 })) {
  console.log(item.title);
}
```

It takes the list's own arguments, minus the page or cursor. `break` stops it: no further page is
fetched.

## Only some fields

When you need only a few fields of every document, its id above all, each list method that takes
`fields` also has a `…Pick()` twin. It walks every page too, 100 documents a page, and resolves one
plain object per document: its `id` and the fields you named.

```ts theme={"dark"}
const about = (await site.pages().listPagesPick(['title', 'slug'])).find(
  (page) => page.slug === '/about-us'
);
// { id: 'ckq3v8x5b0002:en:published', title: 'About Us', slug: '/about-us' }
```

The rows aren't models: each value is as the site sends it (a date is its ISO text). More in
[Find an id](https://docs.fetchski-attract.com/find-an-id.md).

## How each list pages

> [tab] By page
>
> Content lists and members (until `pages`), the media lists (from `total` and `perPage`; their page
> size is `limit`), form submissions, the request log, the access and conversion viewers.

> [tab] By cursor
>
> Conversion events: `since`, with the next cursor while there is more.

> [tab] Backwards
>
> Document versions: `before`, until there is no next one (management SDK).

> [!TIP]
>
> It can never loop: an answer for another page than the one asked for, or the same cursor twice, throws.
> An answer that names its page but no page count throws too, rather than stopping quietly.

## One page

```ts theme={"dark"}
const { results, currentPage, pages } = await site.blogPosts().listBlogs({ page: 2, perPage: 20 });
```

## Watching every call

`onResponse` runs once per attempt with `{ site, method, path, status, ms }`. Wire it to your logger:

```ts theme={"dark"}
const site = createSiteClient({
  baseUrl: 'https://acme.example',
  apiKey: process.env.ACME_API_KEY,
  onResponse: (call) => logger.info(call)
});
```

> [card] [Next: testing](https://docs.fetchski-attract.com/typescript/testing.md)
>
> Three-line tests with `fakeSite()`.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.