Passer au contenu principal
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 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 à l’aide de l’endpoint Get all experiments.
  3. Identifier la variation gagnante en récupérant les résultats de l’expérience.
  4. Récupérer le code JS et CSS à l’aide de l’endpoint Get a variation.
Vous trouverez également un 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.

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

[
  {
    "field": "status",
    "operator": "IN",
    "parameters": ["PAUSED", "STOPPED"]
  },
  {
    "field": "dateStatusModified",
    "operator": "GREATER",
    "parameters": ["2026-01-01T00:00:00"]
  },
  {
    "field": "type",
    "operator": "IN",
    "parameters": ["DEVELOPER"]
  }
]
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.
  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.
GraphQL filter example

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

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

[
  {
    "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.
  2. Incluez le mainGoalId de la réponse précédente.
  3. Comparez l’improvementRate pour chaque variation.

Exemple de requête

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.

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

curl -L "https://api.kameleoon.com/variations/1199120" \
-H "Accept: */*" \
-H "Authorization: Bearer <ACCESS_TOKEN>"

Exemple de réponse

{
  "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.
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()