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

# analyticsReportRows

> Read an analytics report's rows. The first page runs the report once and saves the result for about a day; later pages, paged with the cursors it returns, read that saved result without running the report again, so they stay consistent even if the report is edited meanwhile. Pages hold up to 500 rows (100 by default), and only the first 100000 rows can be paged: use analyticsReportExportStart for more. A request may read at most 4 pages. An agent should not page through more than about 1,000 rows; edit the report to aggregate, or export it, instead. Null when the report does not exist or belongs to another store. Throws REPORT_NOT_READY (409) while the report is PREPARING or FAILED, RESULT_EXPIRED (410) once a cursor's saved result has expired, and INVALID_CURSOR or EXPORT_REQUIRED (400).

**Required scopes:** [`analytics_read`](https://developers.redo.com/docs/api-reference/v3/reference/scopes#scope-analytics_read)

## Arguments

**after** `String`

Forward pagination cursor: rows after it.

**before** `String`

Backward pagination cursor: rows before it.

**first** `Int`

Forward pagination: the first N rows (max 500, default 100). Use with `after`; mutually exclusive with `last`/`before`.

**last** `Int`

Backward pagination: the last N rows (max 500, default 100). Use with `before`; mutually exclusive with `first`/`after`.

**reportId** `ID!` *required*

The id of the report to read.

**timezone** `String`

An IANA timezone to run the report in instead of its own. Only used on the first page; later pages keep the result's timezone.

## Returns

**analyticsReportRows**

A page of a report's rows, read from a result saved when the report last ran for this cursor chain.

**fields**

**columns** *required*

The columns of every row, in the order `values` lists them.

**fields**

**decimalPlaces** `Int`

How many decimal places the merchant shows. Null for the default.

**key** `String!` *required*

The column's stable key, used to sort or relabel it with `analyticsReportUpdate`.

**kind** *required*

What the column holds.

**label** `String!` *required*

The column's header.

**edges** *required*

The rows in this page, each with its cursor.

**fields**

**cursor** `String!` *required*

The row's position in this result; pass to `after` or `before` to page from here.

**node** *required*

The row.

**fields**

**values** *required*

The row's values in the order of the connection's `columns`. Exact numbers (number, currency, percent, and integers too large for JSON) are decimal strings, a date is `YYYY-MM-DD`, a datetime is an ISO-8601 instant. A missing value is null.

**exportRequired** `Boolean!` *required*

True when the result has more than 100000 rows: only the first 100000 can be paged, so use analyticsReportExportStart for all of them.

**nodes** *required*

The rows in this page, without their cursors.

**fields**

**values** *required*

The row's values in the order of the connection's `columns`. Exact numbers (number, currency, percent, and integers too large for JSON) are decimal strings, a date is `YYYY-MM-DD`, a datetime is an ISO-8601 instant. A missing value is null.

**pageInfo** *required*

Pagination metadata for this page.

**fields**

**endCursor** `String`

Cursor of the last edge in this page; pass to `after` to page forward.

**hasNextPage** `Boolean!` *required*

Whether more items exist after this page (drives forward pagination with `first`/`after`).

**hasPreviousPage** `Boolean!` *required*

Whether more items exist before this page (drives backward pagination with `last`/`before`).

**startCursor** `String`

Cursor of the first edge in this page; pass to `before` to page backward.

**resultCreatedAt** *required*

When the report ran to produce this result.

**resultExpiresAt** *required*

When the saved result expires. Cursors stop working then (RESULT\_EXPIRED); start again without one to run the report again.

**revisionNumber** `Int`

The report version this result was run from.

**timezone** `String!` *required*

The IANA timezone the result was run in.

**totalCount** `Int!` *required*

How many rows the whole result has.

## Example

```graphql theme={null}
query {
  analyticsReportRows(after: "...", before: "...", first: 10, last: 10, reportId: "...", timezone: "...") {
    nodes {
      values
    }
    pageInfo { hasNextPage endCursor }
  }
}
```


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