> ## 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.

# Recuperar código JS y CSS de los experimentos

> Recupere el código JavaScript y CSS de las variaciones ganadoras de experimentos pausados o detenidos usando la Automation API.

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](#construir-el-filtro) para recuperar los experimentos basados en código que se pausaron o detuvieron desde 2026.
2. [Recupere los experimentos filtrados](#recuperar-los-experimentos-filtrados) usando el [endpoint Get all experiments](/api-reference/experiment/get-all-experiments).
3. [Identifique la variación ganadora](#encontrar-la-variación-ganadora) mediante la [recuperación de los resultados del experimento](./retrieving-experiment-results-using-the-automation-api).
4. [Recupere el código JS y CSS](#recuperar-el-código-js-y-css) usando el [endpoint Get a variation](/api-reference/variation/get-a-variation).

También puede encontrar un [script completo de Python](#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](/developer-docs/apis/automation-api-rest/get-started/get-started#1-obtain-an-access-token).

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

```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>
  Para generar un filtro válido directamente desde el dashboard de experimentos:

  1. Abra su [dashboard de experimentos](/user-manual/experimentation/web-experimentation/manage-your-web-experiments/manage-your-experiments#access-the-experiments-dashboard).
  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.

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

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

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

### Ejemplo de respuesta

```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\");"
  }
]
```

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](./retrieving-experiment-results-using-the-automation-api).
2. Incluya el `mainGoalId` de la respuesta anterior.
3. Compare el `improvementRate` para cada variación.

### Ejemplo de solicitud

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

### 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](./retrieving-experiment-results-using-the-automation-api).

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

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

### Ejemplo de respuesta

```json theme={null}
{
  "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.

```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()
```
