---
type: api
title: Get a document by its ID
description: Get a document and its source or stored fields from an index.
url: https://www.elastic.co/elastic/docs-builder/docs/4371/api/doc/elasticsearch/v9/operation/operation-get
resource: https://www.elastic.co/elastic/docs-builder/docs/4371/api/doc/elasticsearch/v9/operation/operation-get
products:
  - Elasticsearch
---

# Get a document by its ID

Availability:

## Paths

- `GET` `/{index}/_doc/{id}`

- [Api key auth](/elastic/docs-builder/docs/4371/api/doc/elasticsearch/v9/authentication#apikeyauth)
- [Basic auth](/elastic/docs-builder/docs/4371/api/doc/elasticsearch/v9/authentication#basicauth)
- [Bearer auth](/elastic/docs-builder/docs/4371/api/doc/elasticsearch/v9/authentication#bearerauth)

#### Path Parameters

- `index` (string IndexName)
  The name of the index that contains the document.
- `id` (string Id)
  A unique document identifier.

## Description

Get a document and its source or stored fields from an index.

By default, this API is realtime and is not affected by the refresh rate of the index (when data will become visible for search).
In the case where stored fields are requested with the `stored_fields` parameter and the document has been updated but is not yet refreshed, the API will have to parse and analyze the source to extract the stored fields.
To turn off realtime behavior, set the `realtime` parameter to false.

**Source filtering**

By default, the API returns the contents of the `_source` field unless you have used the `stored_fields` parameter or the `_source` field is turned off.
You can turn off `_source` retrieval by using the `_source` parameter:

```
GET my-index-000001/_doc/0?_source=false
```

If you only need one or two fields from the `_source`, use the `_source_includes` or `_source_excludes` parameters to include or filter out particular fields.
This can be helpful with large documents where partial retrieval can save on network overhead
Both parameters take a comma separated list of fields or wildcard expressions.
For example:

```
GET my-index-000001/_doc/0?_source_includes=*.id&_source_excludes=entities
```

If you only want to specify includes, you can use a shorter notation:

```
GET my-index-000001/_doc/0?_source=*.id
```

**Routing**

If routing is used during indexing, the routing value also needs to be specified to retrieve a document.
For example:

```
GET my-index-000001/_doc/2?routing=user1
```

This request gets the document with ID 2, but it is routed based on the user.
The document is not fetched if the correct routing is not specified.

**Distributed**

The GET operation is hashed into a specific shard ID.
It is then redirected to one of the replicas within that shard ID and returns the result.
The replicas are the primary shard and its replicas within that shard ID group.
This means that the more replicas you have, the better your GET scaling will be.

**Versioning support**

You can use the `version` parameter to retrieve the document only if its current version is equal to the specified one.

Internally, Elasticsearch has marked the old document as deleted and added an entirely new document.
The old version of the document doesn't disappear immediately, although you won't be able to access it.
Elasticsearch cleans up deleted documents in the background as you continue to index more data.

## Required authorization

* Index privileges: `read`

## Query String Parameters

- `preference` (string)
  The node or shard the operation should be performed on.
By default, the operation is randomized between the shard replicas.

If it is set to `_local`, the operation will prefer to be run on a local allocated shard when possible.
If it is set to a custom value, the value is used to guarantee that the same shards will be used for the same custom value.
This can help with "jumping values" when hitting different shards in different refresh states.
A sample value can be something like the web session ID or the user name.
- `realtime` (boolean · default: true)
  If `true`, the request is real-time as opposed to near-real-time.
- `refresh` (boolean · default: false)
  If `true`, the request refreshes the relevant shards before retrieving the document.
Setting it to `true` should be done after careful thought and verification that this does not cause a heavy load on the system (and slow down indexing).
- `routing` (union Routing)
  A custom value used to route operations to a specific shard.
Not allowed when `index.slice.enabled` is `true` for the target index; use `_slice` instead.
  One of: `string` or `string[]`
- `_source` (union SourceConfigParam)
  Indicates whether to return the `_source` field (`true` or `false`) or lists the fields to return.
  One of: `boolean` or `Fields`
- `_source_excludes` (union Fields)
  A comma-separated list of source fields to exclude from the response.
You can also use this parameter to exclude fields from the subset specified in `_source_includes` query parameter.
If the `_source` parameter is `false`, this parameter is ignored.
  One of: `Field` or `Field[]`
- `_source_exclude_vectors` (boolean · default: false)
  Whether vectors should be excluded from _source
- `_source_includes` (union Fields)
  A comma-separated list of source fields to include in the response.
If this parameter is specified, only these source fields are returned.
You can exclude fields from this subset using the `_source_excludes` query parameter.
If the `_source` parameter is `false`, this parameter is ignored.
  One of: `Field` or `Field[]`
- `stored_fields` (union Fields)
  A comma-separated list of stored fields to return as part of a hit.
If no fields are specified, no stored fields are included in the response.
If this field is specified, the `_source` parameter defaults to `false`.
Only leaf fields can be retrieved with the `stored_fields` option.
Object fields can't be returned; if specified, the request fails.
  One of: `Field` or `Field[]`
- `version` (number VersionNumber)
  The version number for concurrency control.
It must match the current version of the document for the request to succeed.
- `version_type` (enum VersionType)
  The version type.

Supported values include:
  - `internal`: Use internal versioning that starts at 1 and increments with each update or delete.
  - `external`: Only index the document if the specified version is strictly higher than the version of the stored document or if there is no existing document.
  - `external_gte`: Only index the document if the specified version is equal or higher than the version of the stored document or if there is no existing document.
NOTE: The `external_gte` version type is meant for special use cases and should be used with care.
If used incorrectly, it can result in loss of data.
  Values: `internal`, `external`, `external_gte`

## Response

`application/json`

- `_index` (string IndexName)
  The name of the index the document belongs to.
- `fields` (map string to object)
  If the `stored_fields` parameter is set to `true` and `found` is `true`, it contains the document fields stored in the index.
- `_ignored` ([] string)
- `found` (boolean)
  Indicates whether the document exists.
- `_id` (string Id)
  The unique identifier for the document.
- `_primary_term` (number)
  The primary term assigned to the document for the indexing operation.
- `_routing` (string)
  The explicit routing, if set.
- `_seq_no` (number SequenceNumber)
  The sequence number assigned to the document for the indexing operation.
Sequence numbers are used to ensure an older version of a document doesn't overwrite a newer version.
- `_source` (object)
  If `found` is `true`, it contains the document data formatted in JSON.
If the `_source` parameter is set to `false` or the `stored_fields` parameter is set to `true`, it is excluded.
- `_version` (number VersionNumber)
  The document version, which is ncremented each time the document is updated.
## Code Examples

#### Console

```console
GET my-index-000001/_doc/1?stored_fields=tags,counter
```

#### JavaScript

```javascript
const response = await client.get({
  index: "my-index-000001",
  id: 1,
  stored_fields: "tags,counter",
});
```

#### Python

```python
resp = client.get(
    index="my-index-000001",
    id="1",
    stored_fields="tags,counter",
)
```

#### curl

```curl
curl -X GET "$ELASTICSEARCH_URL/my-index-000001/_doc/1?stored_fields=tags,counter" \
  -H "Authorization: ApiKey $ELASTIC_API_KEY"
```

#### Java

```java
client.get(g -> g
    .id("1")
    .index("my-index-000001")
    .storedFields(List.of("tags","counter"))
);
```

#### C#

```c#
var response = await client
    .GetAsync<MyDocument>(index: "my-index-000001", id: "1", d1 => d1
        .StoredFields(x => x.Tags, x => x.Counter)
    );
```

#### PHP

```php
$resp = $client->get([
    "index" => "my-index-000001",
    "id" => "1",
    "stored_fields" => "tags,counter",
]);
```

#### Ruby

```ruby
response = client.get(
  index: "my-index-000001",
  id: "1",
  stored_fields: "tags,counter"
)
```

## Response Examples

#### Get a document

A successful response from `GET my-index-000001/_doc/0`. It retrieves the JSON document with the `_id` 0 from the `my-index-000001` index.

```json
{
  "_index": "my-index-000001",
  "_id": "0",
  "_version": 1,
  "_seq_no": 0,
  "_primary_term": 1,
  "found": true,
  "_source": {
    "@timestamp": "2099-11-15T14:12:12",
    "http": {
      "request": {
        "method": "get"
      },
      "response": {
        "status_code": 200,
        "bytes": 1070000
      },
      "version": "1.1"
    },
    "source": {
      "ip": "127.0.0.1"
    },
    "message": "GET /search HTTP/1.1 200 1070000",
    "user": {
      "id": "kimchy"
    }
  }
}
```

#### Get stored fields

A successful response from `GET my-index-000001/_doc/1?stored_fields=tags,counter`, which retrieves a set of stored fields. Field values fetched from the document itself are always returned as an array. Any requested fields that are not stored (such as the counter field in this example) are ignored.

```json
{
  "_index": "my-index-000001",
  "_id": "1",
  "_version": 1,
  "_seq_no" : 22,
  "_primary_term" : 1,
  "found": true,
  "fields": {
      "tags": [
        "production"
      ]
  }
}
```

#### Get metadata fields

A successful response from `GET my-index-000001/_doc/2?routing=user1&stored_fields=tags,counter`, which retrieves the `_routing` metadata field.

```json
{
  "_index": "my-index-000001",
  "_id": "2",
  "_version": 1,
  "_seq_no" : 13,
  "_primary_term" : 1,
  "_routing": "user1",
  "found": true,
  "fields": {
      "tags": [
        "env2"
      ]
  }
}
```

