---
type: api
title: Run a scrolling search
description: **All methods and paths for this operation:**
url: https://www.elastic.co/elastic/docs-builder/docs/4493/api/doc/elasticsearch/v8/operation/operation-scroll
resource: https://www.elastic.co/elastic/docs-builder/docs/4493/api/doc/elasticsearch/v8/operation/operation-scroll
products:
  - Elasticsearch
---

# Run a scrolling search


## Paths

- `POST` (also `GET`) `/_search/scroll/{scroll_id}`
- `POST` (also `GET`) `/_search/scroll`

#### Path parameters

- `scroll_id` (string) — optional, leave it out to use `/_search/scroll` — deprecated
  The scroll ID

## Description

IMPORTANT: The scroll API is no longer recommend for deep pagination. If you need to preserve the index state while paging through more than 10,000 hits, use the `search_after` parameter with a point in time (PIT).

The scroll API gets large sets of results from a single scrolling search request.
To get the necessary scroll ID, submit a search API request that includes an argument for the `scroll` query parameter.
The `scroll` parameter indicates how long Elasticsearch should retain the search context for the request.
The search response returns a scroll ID in the `_scroll_id` response body parameter.
You can then use the scroll ID with the scroll API to retrieve the next batch of results for the request.
If the Elasticsearch security features are enabled, the access to the results of a specific scroll ID is restricted to the user or API key that submitted the search.

You can also use the scroll API to specify a new scroll parameter that extends or shortens the retention period for the search context.

IMPORTANT: Results from a scrolling search reflect the state of the index at the time of the initial search request. Subsequent indexing or document changes only affect later search and scroll requests.

[Read the reference documentation](https://www.elastic.co/guide/en/elasticsearch/reference/8.19/paginate-search-results.html#scroll-search-results)

## Required authorization

- Index privileges: `read`

## Authentication

- Api key: `Authorization: <value>`
  Elasticsearch APIs support key-based authentication.
  You must create an API key and use the encoded value in the request header.
  For example:
  
  
  ```
  curl -X GET "${ES_URL}/_cat/indices?v=true" \
    -H "Authorization: ApiKey ${API_KEY}"
  ```
  
  To get API keys, use the `/_security/api_key` APIs.
- Basic: `Authorization: Basic <credentials>`
- Bearer: `Authorization: Bearer <token>`
  Elasticsearch APIs support the use of bearer tokens in the `Authorization` HTTP header to authenticate with the API.
  For examples, refer to [Token-based authentication services](https://www.elastic.co/guide/en/elasticsearch/reference/current/token-authentication-services.html)

## Query string parameters

- `scroll` (string · default: 1d) — optional
  The period to retain the search context for scrolling.
- `scroll_id` (string) — optional — deprecated
  The scroll ID
- `rest_total_hits_as_int` (boolean · default: false) — optional
  If true, the API response’s hit.total property is returned as an integer. If false, the API response’s hit.total property is returned as an object.

## Request body

`application/json`

- `scroll` (string · default: 1d) — optional
  The period to retain the search context for scrolling.
- `scroll_id` (string) — required
  The scroll ID of the search.

## Response

`application/json`

- `took` (number)
  The number of milliseconds it took Elasticsearch to run the request.
This value is calculated by measuring the time elapsed between receipt of a request on the coordinating node and the time at which the coordinating node is ready to send the response.
It includes:

* Communication time between the coordinating node and data nodes
* Time the request spends in the search thread pool, queued for execution
* Actual run time

It does not include:

* Time needed to send the request to Elasticsearch
* Time needed to serialize the JSON response
* Time needed to send the response to a client
- `timed_out` (boolean)
  If `true`, the request timed out before completion; returned results may be partial or empty.
- `_shards` (object)
  A count of shards used for the request.
  - `failed` (number)
    The number of shards the operation or search attempted to run on but failed.
  - `successful` (number)
    The number of shards the operation or search succeeded on.
  - `total` (number)
    The number of shards the operation or search will run on overall.
  - `failures` (object[])
    - `index` (string)
    - `node` (string)
    - `reason` (object)
      - `type` (string)
        The type of error
      - `reason` (union string) — nullable
        A human-readable explanation of the error, in English.
        One of: `string`
      - `stack_trace` (string)
        The server stack trace. Present only if the `error_trace=true` parameter was sent with the request.
      - `caused_by` (object) — recursive
        Same fields as `reason` in `failures`
      - `root_cause` (object[]) — recursive
        Same fields as `reason` in `failures`
      - `suppressed` (object[]) — recursive
        Same fields as `reason` in `failures`
    - `shard` (number)
    - `status` (string)
    - `primary` (boolean)
  - `skipped` (number)
- `hits` (object)
  The returned documents and metadata.
  - `total` (union oneOf)
    Total hit count information, present only if `track_total_hits` wasn't `false` in the search request.
    - **{ relation, value }**
      - `relation` (enum)
        

Supported values include:
  - `eq`: Accurate
  - `gte`: Lower bound, including returned events or sequences
        Values: `eq`, `gte`
      - `value` (number)
    - **number**
  - `hits` (object[])
    - `_index` (string)
    - `_id` (string)
    - `_score` (union number | string) — nullable
    - `_explanation` (object)
      - `description` (string)
      - `details` (object[])
        - `description` (string)
        - `details` (object[]) — recursive
          Same fields as `details` in `_explanation`
        - `value` (number)
      - `value` (number)
    - `fields` (map string to object)
    - `highlight` (map string to string)
    - `inner_hits` (map string to object)
      Map values (object)
      - `hits` (object) — recursive
        Same fields as `hits`
    - `matched_queries` (union oneOf)
      One of: `string[]` or `string to number`
    - `_nested` (object)
      - `field` (string)
      - `offset` (number)
      - `_nested` (object) — recursive
        Same fields as `_nested` in `hits`
    - `_ignored` (string[])
    - `ignored_field_values` (map string to oneOf)
    - `_shard` (string)
    - `_node` (string)
    - `_routing` (string)
    - `_source` (object)
    - `_rank` (number)
    - `_seq_no` (number)
    - `_primary_term` (number)
    - `_version` (number)
    - `sort` (union[])
  - `max_score` (union number | string) — nullable
- `aggregations` (map string to {} Aggregation result)
  See [Aggregation result](https://www.elastic.co/elastic/docs-builder/docs/4493/api/doc/elasticsearch/v8/types/_types-aggregations-aggregate)
- `_clusters` (object)
  - `skipped` (number)
  - `successful` (number)
  - `total` (number)
  - `running` (number)
  - `partial` (number)
  - `failed` (number)
  - `details` (map string to object)
    Map values (object)
    - `status` (enum)
      Values: `running`, `successful`, `partial`, `skipped`, `failed`
    - `indices` (string)
    - `took` (number)
    - `timed_out` (boolean)
    - `_shards` (object)
      Same fields as `_shards`
    - `failures` (object[])
      Same fields as `failures` in `_shards`
- `fields` (map string to object)
- `max_score` (number)
- `num_reduce_phases` (number)
- `profile` (object)
  - `shards` (object[])
    - `aggregations` (object[])
      - `breakdown` (object)
        - `build_aggregation` (number)
        - `build_aggregation_count` (number)
        - `build_leaf_collector` (number)
        - `build_leaf_collector_count` (number)
        - `collect` (number)
        - `collect_count` (number)
        - `initialize` (number)
        - `initialize_count` (number)
        - `post_collection` (number)
        - `post_collection_count` (number)
        - `reduce` (number)
        - `reduce_count` (number)
      - `description` (string)
      - `time_in_nanos` (number)
      - `type` (string)
      - `debug` (object)
        - `segments_with_multi_valued_ords` (number)
        - `collection_strategy` (string)
        - `segments_with_single_valued_ords` (number)
        - `total_buckets` (number)
        - `built_buckets` (number)
        - `result_strategy` (string)
        - `has_filter` (boolean)
        - `delegate` (string)
        - `delegate_debug` (object) — recursive
          Same fields as `debug` in `aggregations`
        - `chars_fetched` (number)
        - `extract_count` (number)
        - `extract_ns` (number)
        - `values_fetched` (number)
        - `collect_analyzed_ns` (number)
        - `collect_analyzed_count` (number)
        - `surviving_buckets` (number)
        - `ordinals_collectors_used` (number)
        - `ordinals_collectors_overhead_too_high` (number)
        - `string_hashing_collectors_used` (number)
        - `numeric_collectors_used` (number)
        - `empty_collectors_used` (number)
        - `deferred_aggregators` (string[])
        - `segments_with_doc_count_field` (number)
        - `segments_with_deleted_docs` (number)
        - `filters` (object[])
          - `results_from_metadata` (number)
          - `query` (string)
          - `specialized_for` (string)
          - `segments_counted_in_constant_time` (number)
        - `segments_counted` (number)
        - `segments_collected` (number)
        - `map_reducer` (string)
        - `brute_force_used` (number)
        - `dynamic_pruning_attempted` (number)
        - `dynamic_pruning_used` (number)
        - `skipped_due_to_no_data` (number)
      - `children` (object[]) — recursive
        Same fields as `aggregations` in `shards`
    - `cluster` (string)
    - `dfs` (object)
      - `statistics` (object)
        - `type` (string)
        - `description` (string)
        - `time` (string)
        - `time_in_nanos` (number)
        - `breakdown` (object)
          - `collection_statistics` (number)
          - `collection_statistics_count` (number)
          - `create_weight` (number)
          - `create_weight_count` (number)
          - `rewrite` (number)
          - `rewrite_count` (number)
          - `term_statistics` (number)
          - `term_statistics_count` (number)
        - `debug` (map string to object)
        - `children` (object[]) — recursive
          Same fields as `statistics` in `dfs`
      - `knn` (object[])
        - `vector_operations_count` (number)
        - `query` (object[])
          - `type` (string)
          - `description` (string)
          - `time` (string)
          - `time_in_nanos` (number)
          - `breakdown` (object)
            - `advance` (number)
            - `advance_count` (number)
            - `build_scorer` (number)
            - `build_scorer_count` (number)
            - `compute_max_score` (number)
            - `compute_max_score_count` (number)
            - `count_weight` (number)
            - `count_weight_count` (number)
            - `create_weight` (number)
            - `create_weight_count` (number)
            - `match` (number)
            - `match_count` (number)
            - `next_doc` (number)
            - `next_doc_count` (number)
            - `score` (number)
            - `score_count` (number)
            - `set_min_competitive_score` (number)
            - `set_min_competitive_score_count` (number)
            - `shallow_advance` (number)
            - `shallow_advance_count` (number)
          - `debug` (map string to object)
          - `children` (object[]) — recursive
            Same fields as `query` in `knn`
        - `rewrite_time` (number)
        - `collector` (object[])
          - `name` (string)
          - `reason` (string)
          - `time` (string)
          - `time_in_nanos` (number)
          - `children` (object[]) — recursive
            Same fields as `collector` in `knn`
    - `fetch` (object)
      - `type` (string)
      - `description` (string)
      - `time_in_nanos` (number)
      - `breakdown` (object)
        - `load_source` (number)
        - `load_source_count` (number)
        - `load_stored_fields` (number)
        - `load_stored_fields_count` (number)
        - `next_reader` (number)
        - `next_reader_count` (number)
        - `process_count` (number)
        - `process` (number)
      - `debug` (object)
        - `stored_fields` (string[])
        - `fast_path` (number)
      - `children` (object[]) — recursive
        Same fields as `fetch` in `shards`
    - `id` (string)
    - `index` (string)
    - `node_id` (string)
    - `searches` (object[])
      - `collector` (object[])
        - `name` (string)
        - `reason` (string)
        - `time_in_nanos` (number)
        - `children` (object[]) — recursive
          Same fields as `collector` in `searches`
      - `query` (object[])
        - `breakdown` (object)
          - `advance` (number)
          - `advance_count` (number)
          - `build_scorer` (number)
          - `build_scorer_count` (number)
          - `create_weight` (number)
          - `create_weight_count` (number)
          - `match` (number)
          - `match_count` (number)
          - `shallow_advance` (number)
          - `shallow_advance_count` (number)
          - `next_doc` (number)
          - `next_doc_count` (number)
          - `score` (number)
          - `score_count` (number)
          - `compute_max_score` (number)
          - `compute_max_score_count` (number)
          - `count_weight` (number)
          - `count_weight_count` (number)
          - `set_min_competitive_score` (number)
          - `set_min_competitive_score_count` (number)
        - `description` (string)
        - `time_in_nanos` (number)
        - `type` (string)
        - `children` (object[]) — recursive
          Same fields as `query` in `searches`
      - `rewrite_time` (number)
    - `shard_id` (number)
- `pit_id` (string)
- `_scroll_id` (string)
  The identifier for the search and its search context.
You can use this scroll ID with the scroll API to retrieve the next batch of search results for the request.
This property is returned only if the `scroll` query parameter is specified in the request.
- `suggest` (map string to oneOf)
- `terminated_early` (boolean)
## Code examples

#### Console

```console
POST /_search/scroll
{
  "scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ=="
}
```

#### JavaScript

```javascript
const response = await client.scroll({
  scroll_id: "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ==",
});
```

#### Python

```python
resp = client.scroll(
    scroll_id="DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ==",
)
```

#### curl

```curl
curl -X POST "$ELASTICSEARCH_URL/_search/scroll" \
  -H "Authorization: ApiKey $ELASTIC_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "scroll_id": "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ=="
  }'
```

#### Java

```java
client.scroll(s -> s
    .scrollId("DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ==")
);
```

#### C#

```c#
var response = await client
    .ScrollAsync<MyDocument>(d1 => d1
        .ScrollId("DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ==")
    );
```

#### PHP

```php
$resp = $client->scroll([
    "body" => [
        "scroll_id" => "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ==",
    ],
]);
```

#### Ruby

```ruby
response = client.scroll(
  body: {
    "scroll_id": "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ=="
  }
)
```

