# Experiment Annotation (deprecated)

:::{important}
Legacy Telemetry collection APIs are now deprecated.
Please use Glean instead.
:::

This API allows privileged JavaScript to annotate the {doc}`../../data/environment` with any experiments a client is participating in.

The experiment annotations are sent with any ping that includes the {doc}`../../data/environment` data.

## The JS API

Privileged JavaScript code can annotate experiments using the functions exposed by `TelemetryEnvironment.sys.mjs`.

The following function adds an annotation to the environment for the provided `id`, `branch` and `options`. Calling this function repeatedly with the same `id` will overwrite the state and trigger new subsessions (subject to throttling).
`options` is an object that may contain `type` to tag the experiment with a specific type or `enrollmentId` to tag the enrollment in this experiment with an identifier.

```js
TelemetryEnvironment.setExperimentActive(id, branch, [options={}}])
```

This removes the annotation for the experiment with the provided `id`.

```js
TelemetryEnvironment.setExperimentInactive(id)
```

This synchronously returns a dictionary containing the information for each active experiment.

```js
TelemetryEnvironment.getActiveExperiments()
```

:::{note}
Both `setExperimentActive` and `setExperimentInactive` trigger a new subsession. However
the latter only does so if there was an active experiment with the provided `id`.
:::

### Limits and restrictions

To prevent abuses, the content of the experiment `id` and `branch` is limited to
100 characters in length.
`type` is limited to a length of 20 characters.
`enrollmentId` is limited to 40 characters (chosen to be just a little longer than the 36-character long GUID text representation).
