5-Minute Quickstart
Go from zero to your first optimized assessment in five steps.
Step 1: Get your API key
Create an organization to receive your API key. This is the only credential you need.
curl -X POST https://api.qlmdev.com/v1/organizations \
-H "Content-Type: application/json" \
-d '{
"name": "My Organization",
"admin_email": "dev@example.com"
}'
Expected response:
{
"organization_id": "org_x9y8z7",
"name": "My Organization",
"api_key": "qlm_live_k8Jf2mNpQrStUvWx",
"created_at": "2026-03-25T10:00:00Z",
"tier": "free"
}
Save your API key. It is shown only once. Use it in the Authorization header for all subsequent requests:
Authorization: Bearer qlm_live_k8Jf2mNpQrStUvWx
Step 2: Install the SDK
Choose your language. Both SDKs have identical feature coverage.
pip install qlm
import qlm
client = qlm.Client(api_key="qlm_live_k8Jf2mNpQrStUvWx")
# You're ready to go!
npm install @qlm/sdk
import { QLMClient } from '@qlm/sdk';
const client = new QLMClient({ apiKey: 'qlm_live_k8Jf2mNpQrStUvWx' });
// You're ready to go!
Step 3: Your first optimization
Select the best questions from your question bank using personalized question selection. The engine considers all questions simultaneously to find the optimal set.
result = client.optimize(
item_bank_id="ib_m3n4o5",
skill_levels=[0.5, -0.2, 0.8],
items_administered=[],
n_select=5,
constraints={"max_time": 300}
)
print(result.selected_items)
# [{'item_id': 'item_014', 'rank': 1}, {'item_id': 'item_027', 'rank': 2}, ...]
const result = await client.optimize({
itemBankId: 'ib_m3n4o5',
skillLevels: [0.5, -0.2, 0.8],
itemsAdministered: [],
nSelect: 5,
constraints: { maxTime: 300 }
});
console.log(result.selectedItems);
// [{itemId: 'item_014', rank: 1}, {itemId: 'item_027', rank: 2}, ...]
Try it live:
Step 4: Run a personalized session
Sessions manage the full assessment lifecycle: create, submit responses, and check completion.
# 1. Create session
session = client.sessions.create(
item_bank_id="ib_m3n4o5",
domain="clinical",
config={"max_items": 30, "completion_threshold": 0.95}
)
print(session.session_id) # ses_a1b2c3d4
# 2. Submit responses (loop until confident)
update = client.sessions.respond(
session_id=session.session_id,
responses=[
{"item_id": "item_014", "value": 3},
{"item_id": "item_027", "value": 1},
{"item_id": "item_041", "value": 4},
]
)
print(update.confident) # False
print(update.next_items) # [{'item_id': 'item_089', 'rank': 1}, ...]
# 3. Check completion
status = client.sessions.get(session.session_id)
print(status.confident) # True (after enough responses)
// 1. Create session
const session = await client.sessions.create({
itemBankId: 'ib_m3n4o5',
domain: 'clinical',
config: { maxItems: 30, completionThreshold: 0.95 }
});
// 2. Submit responses
const update = await client.sessions.respond(session.sessionId, {
responses: [
{ itemId: 'item_014', value: 3 },
{ itemId: 'item_027', value: 1 },
{ itemId: 'item_041', value: 4 },
]
});
console.log(update.confident); // false
// 3. Check completion
const status = await client.sessions.get(session.sessionId);
console.log(status.confident); // true
Step 5: Try a diagnostic
The same engine powers personalized selection across 10 domains. Just change the domain parameter.
# Clinical diagnostic session
session = client.sessions.create(
item_bank_id="ib_clinical_v2",
domain="clinical",
)
# Cybersecurity risk assessment
session = client.sessions.create(
item_bank_id="ib_cyber_v1",
domain="cyber",
)
# Financial compliance screening
session = client.sessions.create(
item_bank_id="ib_fin_v1",
domain="financial",
)
// Clinical diagnostic session
const session = await client.sessions.create({
itemBankId: 'ib_clinical_v2',
domain: 'clinical',
});
// Cybersecurity — just change the domain
const cyberSession = await client.sessions.create({
itemBankId: 'ib_cyber_v1',
domain: 'cyber',
});
Try it live:
You did it!
You've completed the quickstart. Explore the full API Reference, try the Playground, or read about how it works.