> ## 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 resultados de experimentos usando la Automation API

> Solicite los resultados del experimento, identifique las variaciones ganadoras por tasa de mejora y aplique desgloses y filtros usando la Automation API.

Este tutorial describe cómo solicitar los resultados de los experimentos y determinar las variaciones ganadoras usando la Automation API. Sigue a los tutoriales anteriores sobre [creación de experimentos](./create-a-new-experiment), [modificación de variaciones](./add-and-edit-javascript-in-the-variant-of-your-new-experiment), [asociación de objetivos y segmentos](./create-a-segment-to-target-visitors-by-page-url) y [lanzamiento de experimentos](./add-a-goal-and-segment-to-your-experiment-before-launching).

## Requisitos

* `access_token`

La Automation API requiere un [token de acceso](/developer-docs/apis/automation-api-rest/get-started/get-started). Obtenga el token de forma programática siguiendo las instrucciones de la [sección sobre cómo obtener un token de acceso](/developer-docs/apis/automation-api-rest/get-started/get-started#1-obtain-an-access-token).

* `experimentId`

El `experimentId` es el identificador numérico del experimento del que desea obtener los resultados. Puede encontrarlo en la URL de la aplicación Kameleoon mientras visualiza el experimento (por ejemplo, `https://app.kameleoon.com/.../experiments/188308/...`). Para los experimentos de feature flag, el ID se muestra en el **Rollout Planner**.

## Objetivo

El tutorial utiliza el siguiente experimento de ejemplo:

<Frame>
  ![Experiment\_188308](https://storage.googleapis.com/kameleoon-storage-documentation/developers/images/api-tutorial/experiment_example.jpg)
</Frame>

Este experimento, llamado **Product Page Redesign**, incluye dos variaciones además de la versión original: **Redesign 1 (ID 828220)** y **Redesign 2 (ID 828221)**. Aunque el experimento tiene varios objetivos, este tutorial se centrará únicamente en el objetivo principal, que es hacer seguimiento de las **suscripciones a seguros** mediante **Click Tracking**.

<Note>
  El tutorial también se aplica a los experimentos de Feature Flag; sin embargo, utilice los endpoints `https://api.kameleoon.com/feature-flags/*` en lugar de `https://api.kameleoon.com/experiments/*`:

  * [Endpoint Share feature flag results](/api-reference/featureflag/share-feature-flag-results)
  * [Endpoint Request feature flag's results](/api-reference/featureflag/request-feature-flags-results/)
  * [Endpoint Result](/api-reference/data/poll-results)

  El `experimentId` se encuentra en el **Rollout Planner**:

  <Frame>
    ![](https://storage.googleapis.com/kameleoon-storage-documentation/developers/images/apis/automation-api-rest/tutorials/retrieving-experiment-results/featureflags-id.jpg)
  </Frame>
</Note>

## Cómo funciona la recuperación de resultados

La recuperación de resultados es un proceso de dos pasos:

1. **Solicitar los resultados** — envíe una solicitud POST a `/experiments/{experimentId}/results`. La respuesta devuelve un hash `dataCode`, no los resultados en sí.
2. **Consultar los resultados** — envíe una solicitud GET a `/results?dataCode=<dataCode>` para recuperar los datos reales.

Los dos casos del paso 1 solo se diferencian en cómo se autentica: directamente con su token de acceso (Caso 1) o mediante un token compartido que permite a usuarios no autenticados ver los resultados (Caso 2).

## 1. Recuperar el código de datos

Los siguientes parámetros clave del cuerpo controlan lo que incluye el informe. Para la referencia completa de parámetros, consulte el [endpoint Request experiment's results](/api-reference/experiment/request-experiments-results/).

| Campo                  | Tipo       | Descripción                                                                                                                                                                                                                                                        |
| ---------------------- | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `goalsIds`             | integer\[] | Objetivos a incluir. Pase `[goalId]` para un objetivo específico, `[]` para excluirlos todos o `null` para incluirlos todos.                                                                                                                                       |
| `referenceVariationId` | string     | La variación con la que se compararán las demás. Use `"0"` para la variación original.                                                                                                                                                                             |
| `visitorData`          | boolean    | `true` cuenta visitantes únicos; `false` (valor por defecto) cuenta todas las visitas.                                                                                                                                                                             |
| `sequentialTesting`    | boolean    | `true` habilita las pruebas secuenciales para los intervalos de confianza.                                                                                                                                                                                         |
| `conversionType`       | string     | Recuentos a utilizar para los cálculos de fiabilidad. `ALL_CONVERSION` cuenta cada evento de conversión por visitante; `CONVERTED_VISITS` cuenta cada visita como máximo una vez, independientemente del número de eventos de conversión que ocurran durante ella. |

### Caso 1: Recuperar resultados directamente

Envíe una solicitud POST al [endpoint Request experiment's results](/api-reference/experiment/request-experiments-results/) usando su token de acceso.

**Ejemplo:**

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

**Respuesta:**

```json theme={null}
{"dataCode":"14443931880924098266207585267983330260134079899081739889989435434342588016765"}
```

Pase este `dataCode` al [paso 2](#2-recuperar-los-resultados-del-experimento) para recuperar los resultados reales.

### Caso 2: Compartir resultados sin autorización

Utilice este enfoque para permitir que los usuarios vean los resultados sin un token de acceso — por ejemplo, para compartir una vista de resultados en vivo con una parte interesada.

#### 1. Recuperar un SharedToken

Obtenga un `SharedToken` del [endpoint Share experiment results](/api-reference/experiment/share-experiment-results). Este endpoint acepta el mismo cuerpo de solicitud que el endpoint de resultados.

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

**Respuesta:**

```json theme={null}
{
    "method": "POST",
    "url": "https://api.kameleoon.com/experiments/188308/results",
    "path": "/experiments/188308/results",
    "headers": {
        "SharedToken": "eyJhbGciOiJIUzUxMiJ9.eyJleHAiOjE4NDQ5NDI5MTMsInNoYXJlZENvZGUiOiJhZmM1NzRjN2I4MjY4NTY3NzI2YjZhMDRhMTUxMjgyNjA3Zjk1ZGI4YjA1Y2RkZGY1ZDEwM2ExZDg5ZWM0MmZmIn0.oCECNm5mEhgIthc6eejo9BrfB7p8kEIrpoqtNb4JUiHK6nsxWHMvLc4hHYXCg3DgaBlVoKv6eEZHGty9c-VAoA",
        "Content-Type": "application/json"
    },
    "payload": {
        "visitorData": false,
        "sequentialTesting": true,
        "referenceVariationId": "0",
        "goalsIds": [279599]
    }
}
```

#### 2. Recuperar el dataCode con el SharedToken

Envíe una solicitud POST al [endpoint Request experiment's results](/api-reference/experiment/request-experiments-results/) usando el `SharedToken` de la respuesta anterior en lugar de un token de acceso.

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

**Respuesta:**

```json theme={null}
{"dataCode":"14443931880924098266207585267983330260134079899081739889989435434342588016765"}
```

## 2. Recuperar los resultados del experimento

Tras recibir el `dataCode` de cualquiera de los casos anteriores, llame al [endpoint result](/api-reference/data/poll-results).

```shell theme={null}
curl -L -X GET 'https://api.kameleoon.com/results?dataCode=14443931880924098266207585267983330260134079899081739889989435434342588016765'
```

<Note>
  Si la respuesta devuelve `"status": "WAITING"`, el informe aún se está generando. Reintente la solicitud tras un breve retraso hasta que el estado sea `"READY"`.
</Note>

**Respuesta:**

```json theme={null}
{
 "status": "READY",
 "data": {
  "dataCode": "14443931880924098266207585267983330260134079899081739889989435434342588016765",
  "variationData": {
   "_reference": {
    "breakdownData": {
     "_reference": {
      "intervalData": {},
      "generalData": {
       "visitCount": 126862,
       "visitorCount": 0,
       "goalsData": {
        "279599": {
         "conversionCount": 1898,
         "convertedVisitCount": 1898,
         "revenueCount": 235352.0,
         "convertedVisitorCount": 0,
         "revenuePerVisit": 1.86,
         "revenuePerVisitor": 0.0,
         "conversionRate": 0.014961138875313333,
         "averageCart": 124.0,
         "ratioValue": 0.0,
         "outlierBounds": {
          "lower": 0.1,
          "upper": 99.0
         }
        }
       }
      }
     }
    }
   },
   "828220": {
    "breakdownData": {
     "_reference": {
      "intervalData": {},
      "generalData": {
       "visitCount": 167938,
       "visitorCount": 0,
       "goalsData": {
        "279599": {
         "conversionCount": 7826,
         "convertedVisitCount": 7826,
         "revenueCount": 986076.0,
         "convertedVisitorCount": 0,
         "revenuePerVisit": 5.87,
         "revenuePerVisitor": 0.0,
         "reliability": 100.0,
         "improvementRange": {
          "min": 193.92,
          "max": 229.03,
          "half": 17.56
         },
         "improvementRate": 211.48,
         "conversionRate": 0.04660053114840001,
         "averageCart": 126.0,
         "ratioValue": 0.0,
         "continuousMetrics": {
          "conversions": {
           "reliability": 1.0,
           "improvementRate": 2.114771645178252,
           "halfInterval": 0.10445147824911348,
           "lowerBound": 2.0103201669291386,
           "upperBound": 2.219223123427365
          },
          "revenuePerVisit": {
           "reliability": 1.0,
           "improvementRate": 2.1650098975198366,
           "halfInterval": 0.10613617951119597,
           "lowerBound": 2.0588737180086407,
           "upperBound": 2.2711460770310326
          },
          "averageCart": null
         },
         "outlierBounds": {
          "lower": 0.1,
          "upper": 99.0
         }
        }
       }
      }
     }
    }
   },
   "828221": {
    "breakdownData": {
     "_reference": {
      "intervalData": {},
      "generalData": {
       "visitCount": 174194,
       "visitorCount": 0,
       "goalsData": {
        "279599": {
         "conversionCount": 1477,
         "convertedVisitCount": 1477,
         "revenueCount": 189056.0,
         "convertedVisitorCount": 0,
         "revenuePerVisit": 1.09,
         "revenuePerVisitor": 0.0,
         "reliability": 100.0,
         "improvementRange": {
          "min": -47.93,
          "max": -38.72,
          "half": 4.6
         },
         "improvementRate": -43.33,
         "conversionRate": 0.00847905209134643,
         "averageCart": 128.0,
         "ratioValue": 0.0,
         "continuousMetrics": {
          "conversions": {
           "reliability": 1.0,
           "improvementRate": -0.4332615877700786,
           "halfInterval": 0.027369693136479373,
           "lowerBound": -0.46063128090655797,
           "upperBound": -0.40589189463359926
          },
          "revenuePerVisit": {
           "reliability": 1.0,
           "improvementRate": -0.41497970350459723,
           "halfInterval": 0.028252586463462577,
           "lowerBound": -0.4432322899680598,
           "upperBound": -0.38672711704113466
          },
          "averageCart": null
         },
         "outlierBounds": {
          "lower": 0.1,
          "upper": 99.0
         }
        }
       }
      }
     }
    }
   }
  },
  "ventilationNames": null,
  "cupedDataByGoalId": {}
 }
}
```

## 3. Interpretar los resultados para determinar la variación ganadora

Las variaciones ganadoras deben demostrar una alta fiabilidad (superior al 95%) y una tasa de mejora positiva en comparación con la variación de referencia.

La respuesta JSON muestra que tanto Redesign 1 como Redesign 2 tienen una tasa de fiabilidad del 100%. Sin embargo, Redesign 1 tiene una tasa de mejora del +211,48% frente a la tasa del -43,33% de Redesign 2. Por lo tanto, Redesign 1 es la ganadora.

**Redesign 1**

```json theme={null}
"828220": {
    "breakdownData": {
     "_reference": {
      "intervalData": {},
      "generalData": {
       "visitCount": 167938,
       "visitorCount": 0,
       "goalsData": {
        "279599": {
         "conversionCount": 7826,
         "convertedVisitCount": 7826,
         "revenueCount": 986076.0,
         "convertedVisitorCount": 0,
         "revenuePerVisit": 5.87,
         "revenuePerVisitor": 0.0,
         "reliability": 100.0,
         "improvementRange": {
          "min": 193.92,
          "max": 229.03,
          "half": 17.56
         },
         "improvementRate": 211.48,
```

**Redesign 2**

```json theme={null}
"828221": {
    "breakdownData": {
     "_reference": {
      "intervalData": {},
      "generalData": {
       "visitCount": 174194,
       "visitorCount": 0,
       "goalsData": {
        "279599": {
         "conversionCount": 1477,
         "convertedVisitCount": 1477,
         "revenueCount": 189056.0,
         "convertedVisitorCount": 0,
         "revenuePerVisit": 1.09,
         "revenuePerVisitor": 0.0,
         "reliability": 100.0,
         "improvementRange": {
          "min": -47.93,
          "max": -38.72,
          "half": 4.6
         },
         "improvementRate": -43.33,
```

## 4. Filtrar los resultados del experimento

Obtenga resultados específicos utilizando los parámetros `breakdown` y `filters`. El parámetro `breakdown` organiza los datos por una única dimensión (como el navegador, el sistema operativo o el día de la semana). El parámetro `filters` restringe los datos a un subconjunto de visitantes antes de aplicar el desglose.

<Note>
  El parámetro `breakdown` acepta un **único objeto** por solicitud, no un array. Para comparar varias dimensiones, envíe una solicitud por cada breakdown.
</Note>

### Formatos de breakdown

La mayoría de los tipos de breakdown solo requieren un campo `type`, por ejemplo:

```json theme={null}
"breakdown": {
  "type": "BROWSER"
}
```

Tres tipos de breakdown requieren campos adicionales:

**`INTERVAL`** — segmenta los resultados por un intervalo de tiempo. Combine `"type": "INTERVAL"` con un campo `interval`:

```json theme={null}
"breakdown": {
  "type": "INTERVAL",
  "interval": "DAY"
}
```

El campo `interval` acepta `HOUR`, `DAY`, `WEEK`, `MONTH` o `YEAR`.

**`CUSTOM_DATUM`** — segmenta los resultados por índice de datos personalizados. Combine `"type": "CUSTOM_DATUM"` con un campo `index`:

```json theme={null}
"breakdown": {
  "type": "CUSTOM_DATUM",
  "index": 3
}
```

**`CROSS_CAMPAIGN`** — segmenta los resultados por la exposición a otro experimento o personalización. Proporcione al menos uno de los campos `experiments` o `personalizations`:

```json theme={null}
"breakdown": {
  "type": "CROSS_CAMPAIGN",
  "experiments": [188309],
  "personalizations": []
}
```

### Tipos de filtro

Cada objeto de filtro requiere una cadena `type` y un booleano `include`. Establezca `include` en `true` para restringir los resultados a los visitantes coincidentes, o en `false` para excluirlos. Los campos adicionales dependen de `type`:

| `type`              | Campos adicionales                                      | Valores aceptados                                                                                                    |
| ------------------- | ------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- |
| `BROWSER`           | `values` (string\[])                                    | `CHROME`, `EDGE`, `FIREFOX`, `SAFARI`, `OPERA`, `OTHERS`                                                             |
| `DEVICE_TYPE`       | `values` (string\[])                                    | `DESKTOP`, `TABLET`, `PHONE`, `OTHERS`                                                                               |
| `OS`                | `values` (string\[])                                    | `WINDOWS`, `MAC_OS`, `I_OS`, `LINUX`, `ANDROID`, `WINDOWS_PHONE`, `OTHERS`                                           |
| `NEW_VISITOR`       | `visitorsType` (string)                                 | `NEW_VISITORS`, `RETURNING_VISITORS`                                                                                 |
| `ORIGIN_TYPE`       | `values` (string\[])                                    | `SEO`, `SEM`, `AFFILIATION`, `EMAIL`, `DIRECT`                                                                       |
| `SDK`               | `values` (string\[])                                    | `JAVA`, `ANDROID`, `GO`, `DOTNET`, `PYTHON`, `RUBY`, `IOS`, `PHP`, `JAVASCRIPT`, `NODEJS`, `REACT`, `RUST`, `ELIXIR` |
| `DAY_OF_WEEK`       | `values` (string\[])                                    | `SUNDAY`, `MONDAY`, `TUESDAY`, `WEDNESDAY`, `THURSDAY`, `FRIDAY`, `SATURDAY`                                         |
| `WEATHER_CODE`      | `values` (string\[])                                    | `CLEAR_SKY`, `CLOUDS`, `RAIN`, `THUNDERSTORM`, `SNOW`, `HAIL`, `WIND`, `ATMOSPHERIC_DISTURBANCES`                    |
| `LANGUAGE`          | `values` (string\[])                                    | Códigos de idioma ISO 639-1 (por ejemplo, `EN`, `FR`, `DE`)                                                          |
| `CUSTOM_DATUM`      | `customDataId` (integer), `value` (string)              | Cualquier valor de dato personalizado                                                                                |
| `TARGETING_SEGMENT` | `values` (integer\[])                                   | IDs de segmento                                                                                                      |
| `GOAL_REACHED`      | `goalId` (integer), `index` (integer), `value` (string) |                                                                                                                      |

### Ejemplo: desglose por navegador filtrado a nuevos visitantes

La siguiente solicitud aplica un desglose por navegador restringido a los nuevos visitantes mediante el envío de una solicitud POST al [endpoint Request experiment's results](/api-reference/experiment/request-experiments-results/):

```shell theme={null}
curl -L -X POST 'https://api.kameleoon.com/experiments/188308/results' \
-H 'Content-Type: application/json' \
-H 'Accept: */*' \
-H 'Authorization: Bearer <ACCESS_TOKEN>' \
--data-raw '{
  "visitorData": true,
  "sequentialTesting": true,
  "breakdown": {
    "type": "BROWSER"
  },
  "referenceVariationId": "0",
  "filters": [
    {
      "type": "NEW_VISITOR",
      "visitorsType": "NEW_VISITORS",
      "include": true
    }
  ],
  "goalsIds": [279599]
}'
```

Tras recibir el `dataCode`, recupere los resultados:

```shell theme={null}
curl -L -X GET 'https://api.kameleoon.com/results?dataCode=14443931880924098266207585267983330260134079899081739889989435434342588016765'
```

Una respuesta exitosa devuelve los resultados desglosados por navegador. La respuesta sigue la misma estructura que el paso 2 anterior, con cada tipo de navegador (`CHROME`, `FIREFOX`, `OTHERS`, etc.) como clave dentro de `breakdownData`. La siguiente respuesta está truncada para mayor claridad:

```json theme={null}
{
  "status": "READY",
  "data": {
    "variationData": {
      "828221": {
        "breakdownData": {
          "OTHERS": {
            "intervalData": {},
            "generalData": {
              "visitCount": 0,
              "visitorCount": 587206,
              "goalsData": {
                "279599": {
                  "conversionCount": 5410,
                  "revenueCount": 692480.0,
                  "convertedVisitorCount": 5359,
                  "revenuePerVisitor": 1.18,
                  "reliability": 100.0,
                  "improvementRange": {
                    "min": -53.0,
                    "max": -48.7,
                    "half": 2.15
                  },
                  "improvementRate": -50.85,
                  "conversionRate": 0.009126269145751235,
                  "averageCart": 129.22,
                  "ratioValue": 0.0
                }
              }
            }
          },
          "CHROME": {
            "intervalData": {},
            "generalData": {
              "visitCount": 0,
              "visitorCount": 16,
              "goalsData": {
                "279599": {
                  "conversionCount": 0,
                  "revenueCount": 0.0,
                  "reliability": 50.0,
                  "improvementRate": 0.0,
                  "averageCart": 0.0,
                  "ratioValue": 0.0
                }
              }
            }
          }
        }
      }
    },
    "ventilationNames": null,
    "cupedDataByGoalId": {}
  }
}
```
