Python API Examples¶
This guide shows how to use the REST API from Python with the requests library.
Setup¶
import os
import requests
import pandas as pd
from dotenv import load_dotenv
load_dotenv() # reads .env in the project root
API_KEY = os.environ["URN_API_KEY"]
BASE_URL = "http://localhost:5000" # change for production / Render
Get Study Configuration¶
Retrieve the study’s treatments, factors, urn parameters, and seed.
response = requests.get(f"{BASE_URL}/study_config", params={
"api_key": API_KEY,
"study": "My Study",
})
config = response.json()
# Inspect treatments and factors
print(config["results"]["treatments"]) # e.g. ['Treatment A', 'Treatment B']
print(config["results"]["D"]) # e.g. 'chisquare'
# Build a quick factor-level table
pd.DataFrame({
k: pd.Series(v)
for k, v in config["results"]["factors"].items()
}).fillna("")
Example response:
{
"message": "Success",
"results": {
"treatments": ["Treatment A", "Treatment B"],
"factors": {
"age_group": ["18-40", "41-65", "65+"],
"sex": ["Male", "Female"]
},
"D": "chisquare",
"alpha": 0,
"beta": 1,
"w": 1,
"starting_seed": 100,
"urn_selection": "method1"
},
"status": 200
}
List Participants¶
Fetch all randomized participants and load them into a DataFrame.
response = requests.get(f"{BASE_URL}/study_participants", params={
"api_key": API_KEY,
"study": "My Study",
})
data = response.json()
df = pd.DataFrame(data["results"])
print(f"{len(df)} participants randomized")
df.head()
The response includes one row per participant with columns for the
assigned treatment (trt), factor levels (f_-prefixed), timestamp
(datetime), and the user who performed the randomization (user).
Randomize a Participant¶
Send a POST request with the participant ID and all factor levels.
# Use the factor levels from the config response
factors = config["results"]["factors"]
params = {
"api_key": API_KEY,
"study": "My Study",
"id": "P042",
}
# Add one level per factor
params["age_group"] = "18-40"
params["sex"] = "Female"
response = requests.post(f"{BASE_URL}/study_participants", params=params)
result = response.json()
assigned_treatment = result["results"][0]["trt"]
print(f"Participant P042 assigned to: {assigned_treatment}")
Example response:
{
"message": "Success",
"results": [{
"id": "P042",
"f_age_group": "18-40",
"f_sex": "Female",
"trt": "Treatment A",
"datetime": "2025-09-15 14:30:00",
"user": "alice"
}],
"status": 200
}
Batch Randomization¶
Randomize several participants in a loop, collecting results into a DataFrame.
import random
records = []
for i in range(10):
params = {
"api_key": API_KEY,
"study": "My Study",
"id": f"BATCH-{i:03d}",
}
# Pick a random level for each factor
for factor, levels in factors.items():
params[factor] = random.choice(levels)
resp = requests.post(f"{BASE_URL}/study_participants", params=params)
records.append(resp.json()["results"][0])
df_batch = pd.DataFrame(records)
print(df_batch[["id", "trt"]].to_string(index=False))
Error Handling¶
All endpoints return a status field in the JSON body. Check it to
handle errors gracefully.
response = requests.get(f"{BASE_URL}/study_participants", params={
"study": "My Study",
# no api_key — this will fail
})
data = response.json()
if data["status"] != 200:
print(f"Error {data['status']}: {data['message']}")
Common error codes:
Status |
Meaning |
Fix |
|---|---|---|
|
Missing study name or invalid factor values |
Check required parameters |
|
Missing or invalid API key |
Verify |
|
Study not found in configuration |
Check study name spelling |