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