> ## Documentation Index
> Fetch the complete documentation index at: https://docs.kameleoon.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Récupérer le code JS et CSS des expériences

> Récupérez le code JavaScript et CSS des variations gagnantes d'expériences en pause ou arrêtées à l'aide de l'Automation API.

Ce guide explique comment récupérer le code JavaScript et CSS des variations gagnantes d'expériences Developer (basées sur le code) qui ont été mises en pause ou arrêtées depuis 2026.

Pour récupérer le code, suivez les étapes ci-dessous :

1. [Construire le filtre](#construire-le-filtre) pour récupérer les expériences basées sur le code mises en pause ou arrêtées depuis 2026.
2. [Récupérer les expériences filtrées](#récupérer-les-expériences-filtrées) à l'aide de l'[endpoint Get all experiments](/api-reference/experiment/get-all-experiments).
3. [Identifier la variation gagnante](#trouver-la-variation-gagnante) en [récupérant les résultats de l'expérience](./retrieving-experiment-results-using-the-automation-api).
4. [Récupérer le code JS et CSS](#récupérer-le-code-js-et-css) à l'aide de l'[endpoint Get a variation](/api-reference/variation/get-a-variation).

Vous trouverez également un [script Python complet](#script-python-complet) implémentant le workflow à la fin de ce guide.

## Prérequis

Avant d'utiliser l'Automation API, assurez-vous d'avoir un access token.

Pour obtenir un token, consultez le [guide d'authentification](/developer-docs/apis/automation-api-rest/get-started/get-started#1-obtain-an-access-token).

## Construire le filtre

Pour filtrer les expériences, utilisez le paramètre de requête `filter`. Filtrez les expériences selon les critères suivants :

* `status` : Défini sur `PAUSED` ou `STOPPED`.
* `dateStatusModified` : Défini sur une date supérieure au 1er janvier 2026.
* `type` : Défini sur `DEVELOPER`.

### Exemple de filtre

```json theme={null}
[
  {
    "field": "status",
    "operator": "IN",
    "parameters": ["PAUSED", "STOPPED"]
  },
  {
    "field": "dateStatusModified",
    "operator": "GREATER",
    "parameters": ["2026-01-01T00:00:00"]
  },
  {
    "field": "type",
    "operator": "IN",
    "parameters": ["DEVELOPER"]
  }
]
```

<Tip>
  Pour générer un filtre valide directement depuis le tableau de bord des expériences :

  1. Ouvrez votre [tableau de bord des expériences](/user-manual/experimentation/web-experimentation/manage-your-web-experiments/manage-your-experiments#access-the-experiments-dashboard).
  2. Appliquez les filtres souhaités à l'aide de l'interface utilisateur du tableau de bord.
  3. Ouvrez les **outils de développement** de votre navigateur.
  4. Accédez à l'onglet **Network**.
  5. Recherchez la requête `GetExperiments`.
  6. Ouvrez la requête **GraphQL** correspondante et sélectionnez l'onglet **Payload**.

  Vous pouvez copier la configuration exacte du filtre générée par l'interface et la réutiliser dans l'Automation API.

  <Frame>
    ![GraphQL filter example](https://storage.googleapis.com/kameleoon-storage-documentation/developers/images/apis/automation-api-rest/tutorials/retrieve-js-and-css-code-from-experiments/filter-graphql.png)
  </Frame>
</Tip>

## Récupérer les expériences filtrées

Passez le filtre en tant que paramètre de requête d'URL. Encodez en pourcentage le filtre JSON avant de l'ajouter à l'URL.

### Exemple de requête

```bash theme={null}
curl -L "https://api.kameleoon.com/experiments?filter=%5B%7B%22field%22%3A%22status%22%2C%22operator%22%3A%22IN%22%2C%22parameters%22%3A%5B%22PAUSED%22%2C%22STOPPED%22%5D%7D%2C%7B%22field%22%3A%22dateStatusModified%22%2C%22operator%22%3A%22GREATER%22%2C%22parameters%22%3A%5B%222026-01-01T00%3A00%3A00%22%5D%7D%2C%7B%22field%22%3A%22type%22%2C%22operator%22%3A%22IN%22%2C%22parameters%22%3A%5B%22DEVELOPER%22%5D%7D%5D" \
-H "Accept: */*" \
-H "Authorization: Bearer <ACCESS_TOKEN>"
```

### Exemple de réponse

```json theme={null}
[
  {
    "id": 344428,
    "siteId": 31553,
    "name": "TestJavascriptHelpDoc",
    "type": "DEVELOPER",
    "status": "STOPPED",
    "mainGoalId": 396889,
    "variations": [1199120, 1199121],
    "dateStatusModified": "2026-02-09T11:23:31+0100",
    "commonJavaScriptCode": "console.log(\"hello world\");",
    "globalScript": "console.log(\"hello world\");"
  }
]
```

Dans cette réponse, notez les champs suivants pour les étapes suivantes :

* `id` : L'ID de l'expérience.
* `mainGoalId` : Requis pour récupérer les résultats de l'expérience.
* `variations` : La liste des IDs de variations.

***

## Trouver la variation gagnante

Pour identifier la variation gagnante, suivez les étapes ci-dessous :

1. Récupérez les résultats de l'expérience. Pour plus d'informations, consultez [Récupérer les résultats d'une expérience](./retrieving-experiment-results-using-the-automation-api).
2. Incluez le `mainGoalId` de la réponse précédente.
3. Comparez l'`improvementRate` pour chaque variation.

### Exemple de requête

```bash theme={null}
curl -L -X POST "https://api.kameleoon.com/experiments/344428/results" \
-H "Content-Type: application/json" \
-H "Accept: */*" \
-H "Authorization: Bearer <ACCESS_TOKEN>" \
--data-raw '{
  "visitorData": false,
  "sequentialTesting": true,
  "referenceVariationId": "0",
  "goalsIds": [396889]
}'
```

### Réponse

Après avoir soumis la requête, vous recevrez un code de données. Utilisez ce code pour récupérer les résultats. Pour plus d'informations, consultez le [guide de récupération des résultats d'expérience](./retrieving-experiment-results-using-the-automation-api).

### Identifier le gagnant

Dans les données de réponse, localisez les `goalsData` pour chaque ID de variation (par exemple, `1199120` et `1199121`), en ignorant la variation `_reference` (de référence).

Comparez l'`improvementRate` de chaque variation. La variation avec l'`improvementRate` positif le plus élevé est la gagnante.

Dans cet exemple :

* `1199120` a un `improvementRate` de **26,57**.
* `1199121` a un `improvementRate` de **-15,5**.

Par conséquent, la variation gagnante est `1199120`.

## Récupérer le code JS et CSS

Vous pouvez trouver le code au niveau de l'expérience dans les champs suivants de votre réponse initiale d'expérience :

* `commonJavaScriptCode`
* `commonCssCode`
* `globalScript` (script d'expérience personnalisé)

Pour récupérer le code au niveau de la variation, utilisez l'endpoint Get a variation.

### Exemple de requête

```bash theme={null}
curl -L "https://api.kameleoon.com/variations/1199120" \
-H "Accept: */*" \
-H "Authorization: Bearer <ACCESS_TOKEN>"
```

### Exemple de réponse

```json theme={null}
{
  "id": 804410,
  "siteId": 24101,
  "name": "Variation 1",
  "jsCode": "(function() {})();",
  "cssCode": "/* Add CSS code to this variation */",
  "isJsCodeAfterDomReady": false
}
```

### Localiser le code

Vous pouvez trouver le code au niveau de la variation dans les champs suivants :

* **Code JavaScript** : `jsCode`
* **Code CSS** : `cssCode`

## Script Python complet

Le script suivant automatise l'ensemble du workflow pour construire le filtre, récupérer les expériences, trouver la variation gagnante et extraire le code.

```python theme={null}
import requests
import json
import urllib.parse
import time
from datetime import datetime

# ==============================
# Configuration
# ==============================

ACCESS_TOKEN = "<ACCESS TOKEN>"
BASE_URL = "https://api.kameleoon.com"
DATE_FILTER = "2026-01-01T00:00:00"

HEADERS = {
    "Accept": "*/*",
    "Authorization": f"Bearer {ACCESS_TOKEN}"
}


# ==============================
# Step 1: Build and Encode Filter
# ==============================

def build_filter():
    filter_payload = [
        {
            "field": "status",
            "operator": "IN",
            "parameters": ["PAUSED", "STOPPED"]
        },
        {
            "field": "dateStatusModified",
            "operator": "GREATER",
            "parameters": [DATE_FILTER]
        },
        {
            "field": "type",
            "operator": "IN",
            "parameters": ["DEVELOPER"]
        }
    ]

    filter_json = json.dumps(filter_payload)
    encoded_filter = urllib.parse.quote(filter_json)
    return encoded_filter


# ==============================
# Step 2: Retrieve Experiments
# ==============================

def get_filtered_experiments(encoded_filter):
    url = f"{BASE_URL}/experiments?filter={encoded_filter}"
    response = requests.get(url, headers=HEADERS)
    response.raise_for_status()
    return response.json()


# ==============================
# Step 3: Retrieve Experiment Results
# ==============================

def get_experiment_results(experiment_id, main_goal_id):
    url = f"{BASE_URL}/experiments/{experiment_id}/results"

    payload = {
        "visitorData": False,
        "sequentialTesting": True,
        "referenceVariationId": "0",
        "goalsIds": [main_goal_id]
    }

    response = requests.post(url, headers={
        **HEADERS,
        "Content-Type": "application/json"
    }, json=payload)

    response.raise_for_status()
    data_code = response.json()["dataCode"]

    experiment_results = requests.get(f"{BASE_URL}/results?dataCode={data_code}")

    if experiment_results.json().get("status") != "READY":
        print("Results not ready. Waiting 1s and retrying.")
        time.sleep(1)
        experiment_results = requests.get(f"{BASE_URL}/results?dataCode={data_code}")

    return experiment_results.json()


# ==============================
# Step 4: Identify Winning Variation
# ==============================

def get_winning_variation(results_json, main_goal_id):
    variation_data = results_json.get("data", {}).get("variationData", {})

    best_variation_id = None
    best_improvement = float("-inf")

    for variation_id, variation_content in variation_data.items():

        # Skip reference
        if variation_id == "_reference":
            continue

        try:
            goal_data = (
                variation_content["breakdownData"]["_reference"]
                ["generalData"]["goalsData"][str(main_goal_id)]
            )

            improvement = goal_data.get("improvementRate", None)

            if improvement is not None and improvement > best_improvement:
                best_improvement = improvement
                best_variation_id = variation_id

        except KeyError:
            continue

    return best_variation_id, best_improvement


# ==============================
# Step 5: Retrieve Variation Code
# ==============================

def get_variation_code(variation_id):
    url = f"{BASE_URL}/variations/{variation_id}"
    response = requests.get(url, headers=HEADERS)
    response.raise_for_status()
    return response.json()


# ==============================
# Main Workflow
# ==============================

def main():
    print("Building filter...")
    encoded_filter = build_filter()

    print("Retrieving experiments...")
    experiments = get_filtered_experiments(encoded_filter)

    if not experiments:
        print("No experiments found.")
        return

    for experiment in experiments:
        experiment_id = experiment["id"]
        main_goal_id = experiment.get("mainGoalId")

        print(f"\nProcessing experiment {experiment_id}...")

        if not main_goal_id:
            print("No main goal defined. Skipping.")
            continue

        print("Retrieving results...")
        results = get_experiment_results(experiment_id, main_goal_id)

        if results.get("status") != "READY":
            print("Results not ready. Skipping.")
            continue

        winning_variation_id, improvement = get_winning_variation(results, main_goal_id)

        if not winning_variation_id:
            print("No winning variation found.")
            continue

        print(f"Winning variation: {winning_variation_id} (Improvement: {improvement}%)")

        print("Retrieving JS and CSS code...")
        variation_data = get_variation_code(winning_variation_id)

        global_js_code = experiment.get("globalScript","")
        common_css_code = experiment.get("commonCssCode","")
        common_js_code = experiment.get("commonJavaScriptCode","")
        js_code = variation_data.get("jsCode", "")
        css_code = variation_data.get("cssCode", "")
        
        print("\n--- Global JavaScript Code ---")
        print(global_js_code)

        print("\n--- Common JavaScript Code ---")
        print(common_js_code)

        print("\n--- Common CSS Code ---")
        print(common_css_code)

        print("\n--- JavaScript Code ---")
        print(js_code)

        print("\n--- CSS Code ---")
        print(css_code)


if __name__ == "__main__":
    main()
```
