Saltar al contenido principal
Esta guía explica cómo recuperar el código JavaScript y CSS de las variaciones ganadoras de experimentos Developer (basados en código) que se pausaron o detuvieron desde 2026. Para recuperar el código, complete los siguientes pasos:
  1. Construya el filtro para recuperar los experimentos basados en código que se pausaron o detuvieron desde 2026.
  2. Recupere los experimentos filtrados usando el endpoint Get all experiments.
  3. Identifique la variación ganadora mediante la recuperación de los resultados del experimento.
  4. Recupere el código JS y CSS usando el endpoint Get a variation.
También puede encontrar un script completo de Python que implementa el flujo de trabajo al final de esta guía.

Requisitos previos

Antes de usar la Automation API, asegúrese de disponer de un token de acceso. Para obtener un token, consulte la guía de autenticación.

Construir el filtro

Para filtrar los experimentos, utilice el parámetro de consulta filter. Filtre los experimentos según los siguientes criterios:
  • status: Establecido en PAUSED o STOPPED.
  • dateStatusModified: Establecido como posterior al 1 de enero de 2026.
  • type: Establecido en DEVELOPER.

Ejemplo de filtro

[
  {
    "field": "status",
    "operator": "IN",
    "parameters": ["PAUSED", "STOPPED"]
  },
  {
    "field": "dateStatusModified",
    "operator": "GREATER",
    "parameters": ["2026-01-01T00:00:00"]
  },
  {
    "field": "type",
    "operator": "IN",
    "parameters": ["DEVELOPER"]
  }
]
Para generar un filtro válido directamente desde el dashboard de experimentos:
  1. Abra su dashboard de experimentos.
  2. Aplique los filtros deseados utilizando la interfaz del dashboard.
  3. Abra las Herramientas para desarrolladores de su navegador.
  4. Vaya a la pestaña Network.
  5. Busque la solicitud GetExperiments.
  6. Abra la solicitud GraphQL correspondiente y seleccione la pestaña Payload.
Puede copiar la configuración exacta del filtro generada por la interfaz y reutilizarla en la Automation API.
GraphQL filter example

Recuperar los experimentos filtrados

Pase el filtro como un parámetro de consulta en la URL. Codifique en porcentaje el JSON del filtro antes de añadirlo a la URL.

Ejemplo de solicitud

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>"

Ejemplo de respuesta

[
  {
    "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\");"
  }
]
De esta respuesta, tenga en cuenta los siguientes campos para los próximos pasos:
  • id: El ID del experimento.
  • mainGoalId: Necesario para recuperar los resultados del experimento.
  • variations: La lista de IDs de las variaciones.

Encontrar la variación ganadora

Para identificar la variación ganadora, complete los siguientes pasos:
  1. Recupere los resultados del experimento. Para más información, consulte Recuperar resultados del experimento.
  2. Incluya el mainGoalId de la respuesta anterior.
  3. Compare el improvementRate para cada variación.

Ejemplo de solicitud

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]
}'

Respuesta

Tras enviar la solicitud, recibirá un código de datos. Utilice este código para recuperar los resultados. Para más información, consulte la guía de recuperación de resultados de experimento.

Identificar al ganador

En los datos de la respuesta, localice los goalsData para cada ID de variación (por ejemplo, 1199120 y 1199121), ignorando la variación _reference (línea base). Compare el improvementRate de cada variación. La variación con el improvementRate positivo más alto es la ganadora. En este ejemplo:
  • 1199120 tiene un improvementRate de 26.57.
  • 1199121 tiene un improvementRate de -15.5.
Por lo tanto, la variación ganadora es 1199120.

Recuperar el código JS y CSS

Puede encontrar el código a nivel de experimento en los siguientes campos de la respuesta inicial del experimento:
  • commonJavaScriptCode
  • commonCssCode
  • globalScript (script personalizado del experimento)
Para recuperar el código a nivel de variación, utilice el endpoint Get a variation.

Ejemplo de solicitud

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

Ejemplo de respuesta

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

Localizar el código

Puede encontrar el código a nivel de variación en los siguientes campos:
  • Código JavaScript: jsCode
  • Código CSS: cssCode

Script completo de Python

El siguiente script automatiza el flujo de trabajo completo para construir el filtro, recuperar los experimentos, encontrar la variación ganadora y extraer el código.
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()