> For the complete documentation index, see [llms.txt](https://docs.disasm.dev/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.disasm.dev/datadome/tags-ch-le.md).

# Tags (CH/LE)

Some DataDome-protected sites require the `tags.js` challenge in addition to an interstitial or CAPTCHA. Tags submit device and behavioural signals, and many high-security sites will not let you act (for example, add to cart) until they are solved. Tags acts adds additional trust score to your session, and you will often get blocked down the line without solving tags. There is no explicit block page for Tags.

Tags are solved in two ordered requests:

* **CH** - an initial request carrying browser properties.
* **LE** - a follow-up request carrying events data (mouse movements and clicks).

You must solve **CH first**, then use the `datadome` cookie it returns to solve **LE**.

## When you need tags

A typical high-security flow looks like this:

1. Request `https://www.example.com`.
2. Blocked with a 403 CAPTCHA.
3. Solve the [CAPTCHA](/datadome/slider-captcha.md).
4. Retry the request - now `200`.
5. Solve **tags** (CH then LE).
6. Request the product page.
7. Send the add-to-cart request.

If you skip tags, requests that depend on them - and the `t=bv` signal - can look like a proxy ban when they are not. See [`t=bv`](/datadome/general-information.md#t-bv) in the overview.

## Request parameters

Both calls use the same [tags endpoint](/datadome/api-reference.md), changing only `type`:

| Field        | Description                                                        |
| ------------ | ------------------------------------------------------------------ |
| `type`       | `ch` for the first call, `le` for the second.                      |
| `cid`        | The current `datadome` cookie in your jar.                         |
| `site_key`   | The `ddk` / DataDome site key.                                     |
| `referer`    | The last URL visited, unescaped (no URL encoding).                 |
| `user_agent` | The User-Agent for your session.                                   |
| `ip_address` | The proxy IP for the session - used to set the payload's timezone. |

## Workflow

1. After solving the interstitial or CAPTCHA, you have an unblocked request to the target. Using Charles, visit the same page and find the `tags.js` request (on some sites the path is under `/js/`).
2. Request a **CH** payload from our API with `type: "ch"`. Make sure `cid` is the current `datadome` cookie from your jar.
3. Submit the returned `payload` to DataDome. You receive a new `datadome` cookie.
4. Request an **LE** payload from our API with `type: "le"`, using the cookie from the previous step as `cid`.
5. Submit the LE `payload` to DataDome. The new `datadome` cookie it returns is your solved-tags cookie - use it going forward.

{% hint style="info" %}
The `payload` we return is the POST body you submit to DataDome - usually the request whose URL ends in `/js/`. Submit it unchanged.
{% endhint %}


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.disasm.dev/datadome/tags-ch-le.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
