---
title: "List a site's pages"
description: "List the pages of a site resource with their state, and the reason when a page failed. Filter by status and page with a cursor."
canonical: "https://lookio.app/docs/api/resources/list-site-pages"
updated: "2026-10-17"
---

# List a site's pages

Requires `resources:read`.

Pages come sorted by address. `counts` covers every page of the site, whatever the filter. Filter with `status` (`ready`, `busy` or `failed`) and pass `next_cursor` back as `cursor` while there are more. The list holds up to 5,000 pages.

Use it to find out why a site imported fewer pages than expected. Read the `detail` of a failed page, then [retry the failed pages](/docs/api/resources/retry-failed-pages).

```http
GET https://api.lookio.app/v1/resources/{resource_id}/pages
```

## Authorizations

- `Authorization` (bearer, in header, required)

## Path parameters

- `resource_id` (`string`, required, pattern: `^res_[abcdefghjkmnpqrstuvwxyz23456789]{12}$`)

## Query parameters

- `limit` (`integer`, range: `1–100`): Number of items to return. Values outside 1-100 are clamped, and the response reports the limit actually applied.
- `cursor` (`string`, pattern: `^doc_[abcdefghjkmnpqrstuvwxyz23456789]{12}$`): Pass `next_cursor` from the previous page, unchanged.
- `status` (`enum<string>`, one of: `ready, busy, failed`): Only pages in this state. `busy` is every page being read.

## Response

**200**: List a site's pages

- `data` (`object`, required)
- `data.url` (`string,null`, required)
- `data.last_synced_at` (`string,null`, required)
- `data.counts` (`object`, required): Over every page of the site, whatever the filter.
- `data.counts.ready` (`integer`, required)
- `data.counts.busy` (`integer`, required)
- `data.counts.failed` (`integer`, required)
- `data.pages` (`object[]`, required): One page of the site's pages, sorted by address.
- `data.pages.id` (`string`, required, pattern: `^doc_[abcdefghjkmnpqrstuvwxyz23456789]{12}$`)
- `data.pages.url` (`string,null`, required)
- `data.pages.title` (`string,null`, required)
- `data.pages.status` (`string`, required)
- `data.pages.detail` (`string,null`, required): Why a page could not be read, when it failed.
- `data.pages.missing` (`integer`, required): Consecutive syncs where the page was absent. A page absent twice is removed.
- `data.pages.updated_at` (`string`, required)
- `data.has_more` (`boolean`, required)
- `data.next_cursor` (`string,null`, required)
- `request_id` (`string`, required)

```json
{
  "data": {
    "url": null,
    "last_synced_at": null,
    "counts": {
      "ready": 123,
      "busy": 123,
      "failed": 123
    },
    "pages": [
      {
        "id": "<string>",
        "url": null,
        "title": null,
        "status": "<string>",
        "detail": null,
        "missing": 123,
        "updated_at": "<string>"
      }
    ],
    "has_more": true,
    "next_cursor": null
  },
  "request_id": "<string>"
}
```

**400**: Possible codes: invalid_request, unknown_field, invalid_parameter, invalid_cursor

- `error` (`object`, required)
- `error.type` (`string`, required)
- `error.code` (`string`, required)
- `error.message` (`string`, required)
- `error.param` (`string`)
- `error.docs_url` (`string`, required)
- `error.action_url` (`string<uri>`)
- `request_id` (`string`, required)

```json
{
  "error": {
    "type": "<string>",
    "code": "<string>",
    "message": "<string>",
    "param": "<string>",
    "docs_url": "<string>",
    "action_url": "<string>"
  },
  "request_id": "<string>"
}
```

**401**: Possible codes: authentication_required, invalid_api_key, api_key_expired, api_key_revoked, invalid_access_key

- `error` (`object`, required)
- `error.type` (`string`, required)
- `error.code` (`string`, required)
- `error.message` (`string`, required)
- `error.param` (`string`)
- `error.docs_url` (`string`, required)
- `error.action_url` (`string<uri>`)
- `request_id` (`string`, required)

```json
{
  "error": {
    "type": "<string>",
    "code": "<string>",
    "message": "<string>",
    "param": "<string>",
    "docs_url": "<string>",
    "action_url": "<string>"
  },
  "request_id": "<string>"
}
```

**403**: Possible codes: insufficient_scope, feature_not_available, admin_required, permission_denied

- `error` (`object`, required)
- `error.type` (`string`, required)
- `error.code` (`string`, required)
- `error.message` (`string`, required)
- `error.param` (`string`)
- `error.docs_url` (`string`, required)
- `error.action_url` (`string<uri>`)
- `request_id` (`string`, required)

```json
{
  "error": {
    "type": "<string>",
    "code": "<string>",
    "message": "<string>",
    "param": "<string>",
    "docs_url": "<string>",
    "action_url": "<string>"
  },
  "request_id": "<string>"
}
```

**404**: Possible codes: resource_not_found

- `error` (`object`, required)
- `error.type` (`string`, required)
- `error.code` (`string`, required)
- `error.message` (`string`, required)
- `error.param` (`string`)
- `error.docs_url` (`string`, required)
- `error.action_url` (`string<uri>`)
- `request_id` (`string`, required)

```json
{
  "error": {
    "type": "<string>",
    "code": "<string>",
    "message": "<string>",
    "param": "<string>",
    "docs_url": "<string>",
    "action_url": "<string>"
  },
  "request_id": "<string>"
}
```

**409**: Possible codes: conflict, assistant_has_no_resources

- `error` (`object`, required)
- `error.type` (`string`, required)
- `error.code` (`string`, required)
- `error.message` (`string`, required)
- `error.param` (`string`)
- `error.docs_url` (`string`, required)
- `error.action_url` (`string<uri>`)
- `request_id` (`string`, required)

```json
{
  "error": {
    "type": "<string>",
    "code": "<string>",
    "message": "<string>",
    "param": "<string>",
    "docs_url": "<string>",
    "action_url": "<string>"
  },
  "request_id": "<string>"
}
```

**429**: Possible codes: rate_limited

- `error` (`object`, required)
- `error.type` (`string`, required)
- `error.code` (`string`, required)
- `error.message` (`string`, required)
- `error.param` (`string`)
- `error.docs_url` (`string`, required)
- `error.action_url` (`string<uri>`)
- `request_id` (`string`, required)

```json
{
  "error": {
    "type": "<string>",
    "code": "<string>",
    "message": "<string>",
    "param": "<string>",
    "docs_url": "<string>",
    "action_url": "<string>"
  },
  "request_id": "<string>"
}
```

**500**: Possible codes: internal_error

- `error` (`object`, required)
- `error.type` (`string`, required)
- `error.code` (`string`, required)
- `error.message` (`string`, required)
- `error.param` (`string`)
- `error.docs_url` (`string`, required)
- `error.action_url` (`string<uri>`)
- `request_id` (`string`, required)

```json
{
  "error": {
    "type": "<string>",
    "code": "<string>",
    "message": "<string>",
    "param": "<string>",
    "docs_url": "<string>",
    "action_url": "<string>"
  },
  "request_id": "<string>"
}
```

**Example request**

```bash
curl --request GET \
  --url 'https://api.lookio.app/v1/resources/<resource_id>/pages' \
  --header 'Authorization: <api-key>'
```
