---
type: api
title: Check a document
description: Verify that a document exists.
url: https://www.elastic.co/elastic/docs-builder/docs/4493/api/doc/elasticsearch-serverless/operation/operation-exists
resource: https://www.elastic.co/elastic/docs-builder/docs/4493/api/doc/elasticsearch-serverless/operation/operation-exists
products:
  - Elasticsearch Serverless
---

# Check a document

## Paths

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

#### Path parameters

- `index` (string) — required
  A comma-separated list of data streams, indices, and aliases.
It supports wildcards (`*`).
- `id` (string) — required
  A unique document identifier.

## Description

Verify that a document exists.
For example, check to see if a document with the `_id` 0 exists:

```
HEAD my-index-000001/_doc/0
```

If the document exists, the API returns a status code of `200 - OK`.
If the document doesn’t exist, the API returns `404 - Not Found`.

**Versioning support**

You can use the `version` parameter to check 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.

## Authentication

- Api key: `Authorization: <value>`
  Elasticsearch APIs use 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}"
  ```
  
  For more information about where to find API keys for the Elasticsearch endpoint (${ES_URL}) for a project, go to [Get started with Elasticsearch Serverless](https://www.elastic.co/docs/solutions/search/serverless-elasticsearch-get-started).

## Query string parameters

- `preference` (string) — optional
  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) — optional
  If `true`, the request is real-time as opposed to near-real-time.
- `refresh` (boolean · default: false) — optional
  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 oneOf) — optional
  A custom value used to route operations to a specific shard.
  One of: `string[]` or `string`
- `_source` (union oneOf) — optional
  Indicates whether to return the `_source` field (`true` or `false`) or lists the fields to return.
  One of: `boolean` or `string`
- `_source_excludes` (union oneOf) — optional
  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: `string[]` or `string`
- `_source_includes` (union oneOf) — optional
  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: `string[]` or `string`
- `stored_fields` (union oneOf) — optional
  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`.
  One of: `string[]` or `string`
- `version` (number) — optional
  Explicit version number for concurrency control.
The specified version must match the current version of the document for the request to succeed.
- `version_type` (enum) — optional
  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`

## Code examples

#### Console

```console
HEAD my-index-000001/_doc/0
```

#### JavaScript

```javascript
const response = await client.exists({
  index: "my-index-000001",
  id: 0,
});
```

#### Python

```python
resp = client.exists(
    index="my-index-000001",
    id="0",
)
```

#### curl

```curl
curl "$ELASTICSEARCH_URL/my-index-000001/_doc/0" \
  --head \
  -H "Authorization: ApiKey $ELASTIC_API_KEY"
```

#### Java

```java
client.exists(e -> e
    .id("0")
    .index("my-index-000001")
);
```

#### C#

```c#
var response = await client.ExistsAsync(index: "my-index-000001", id: "0");
```

#### PHP

```php
$resp = $client->exists([
    "index" => "my-index-000001",
    "id" => "0",
]);
```

#### Ruby

```ruby
response = client.exists(
  index: "my-index-000001",
  id: "0"
)
```

