In order to handle result sets containing a large number of rows, Merchant
Center Query Language supports pagination. Two parameters are available to
control pagination in the [`reports.search` request
body](https://developers.google.com/shopping-content/reference/rest/v2.1/reports/search#request-body):
`page_size` and `page_token`, in addition to one output field in the [response
body](https://developers.google.com/shopping-content/reference/rest/v2.1/reports/search#response-body):
`next_page_token`.

The `page_size` parameter specifies the maximum number of rows to retrieve in a
single request. If unspecified, it is automatically set to the maximum page size
of 1000 rows.

The `page_token` parameter specifies the token of the page to return. If
unspecified, the first page is returned. To retrieve a subsequent page, the
value received as the `next_page_token` from the previous `reports.search` call
should be provided as a `page_token`. When a `page_token` is provided, all other
parameters in the call should match the previous call that returned the
`page_token` to avoid unexpected behavior.

Example:

    SELECT
      segments.offer_id,
      metrics.impressions,
      metrics.clicks,
      metrics.ctr
    FROM MerchantPerformanceView
    WHERE segments.date BETWEEN '2021-12-01' AND '2021-12-31'

For this query, assume the account contains 100,000 `offer_ids` and the
`page_size` is set to 200. The result set will then contain 200 `ReportRow`
objects in the first response, along with a `next_page_token`.

To retrieve the next 200 rows, send the request again with the same page size,
but update the request's `page_token` to the previous response's
`next_page_token`.

Here is a response body example (the first five results plus the
`next_page_token`):

    {
      "results": [
        {
          "segments": {
            "offerId": "12345"
          },
          "metrics": {
            "clicks": "0",
            "impressions": "59",
            "ctr": 0
          }
        },
        {
          "segments": {
            "offerId": "12346"
          },
          "metrics": {
            "clicks": "9625",
            "impressions": "276695",
            "ctr": 0.034785594246372356
          }
        },
        {
          "segments": {
            "offerId": "12347"
          },
          "metrics": {
            "clicks": "148",
            "impressions": "22045",
            "ctr": 0.0067135404853708325
          }
        },
        {
          "segments": {
            "offerId": "12348"
          },
          "metrics": {
            "clicks": "11",
            "impressions": "1100",
            "ctr": 0.01
          }
        },
        {
          "segments": {
            "offerId": "12349"
          },
          "metrics": {
            "clicks": "569",
            "impressions": "62977",
            "ctr": 0.0090350445400701838
          }
        },
        ...
      ],
      "nextPageToken": "CMgB"
    }

> [!IMPORTANT]
> **Key Point:** The `next_page_token` is not populated in the response that contains the last batch of rows.