---
title: Write async API for .NET Client
slug: cms-12/docs/write-async
docTags: 
createdAt: 2026-08-10T15:56:00.000Z
---

:::hint{type="info"}
**Note**
Optimizely Search & Navigation has asynchronous methods that are supported only in the .NET Core version.
:::

You can leverage the benefits of asynchronous programming and performance improvements with the [Read](docId\:q5fGE-zQHt06UITiSiCYK) and **Write** async APIs, which are particularly necessary and useful if you are building your app with a microservices architecture or loading data from the FIND service and UI independently for better user experiences.

### UpdateAsync()

Perform a non-blocking updates an existing document to the backend.

- Parameters – Require a document id (`DocumentId`). We have some other overloading methods allowing pass more parameters.
- Return value – return an awaitable `Task<IndexResult>`.

```csharp
_searchClient.UpdateAsync<MyDocument>("your_existing_document_id", new UpdateRequestBody({//your document's fields}));
```

### IndexAsync()

Perform a non-blocking index document or a bulk of documents to the store.

- Parameters – Require a document object. We have some other overloading methods for passing different type of parameters.
- Return value –
  - Indexing a single document will return an awaitable `Task<IndexResult>`.
  - Indexing a bulk documents will return an awaitable `Task<BulkResult>`.

```csharp
await _searchClient.IndexAsync(new MyDocument());
```

### DeleteByQueryAsync()

Perform a non-blocking delete documents. We perform a "search and then delete" based on your matching documents by your query.

- Parameters – Require a `IQuery` object.
- Return value –  Return an awaitable `Task<DeleteByQueryResult>`.

```csharp
var query = new IdsQuery("1", "4", "100");
_searchClient.DeleteByQueryAsync(query, null);
//if you're using our ClientExtensions just call
_searchClient.DeleteAsync<MyDocument>(x => x.Name.Match("alloy"));
```

### TrackAsync()

Perform an asynchronous track query to FIND service. It will store a track document in your statistics index.

- Return an awaitable `Task<TrackQueryResult>`, `TrackQueryResult` contains a track id when successfully.

This is used in `Track()` extension method and you do not need to care much about this except that `Track` will be perform in a separate thread.

```csharp
_searchClient.Search<ArticlePage>()
  .For("alloy")
  .Track() //perform a non-blocking track to FIND (TrackQueryAsync)
  .GetResultAsync();
```

### TrackHitAsync()

Perform an increasement for a track, this is usually used for the click calculation.

- Parameters –
  - Required parameters – The query string and the hit id are required.
  - Optional parameter – An action for the `TrackHitCommand`.
- Return value – Return an awaitable `Task<TrackHitResult>`.

```csharp
using EPiServer.Find.Statistics;
await _searchClient.Statistics().TrackHitAsync("query", "type/hit_id");
```
