5-Minute Quickstart

Go from zero to your first optimized assessment in five steps.

1. API Key 2. Install 3. Optimize 4. Session 5. Diagnostic

Step 1: Get your API key

Create an organization to receive your API key. This is the only credential you need.

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

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:

Header
Authorization: Bearer qlm_live_k8Jf2mNpQrStUvWx

Step 2: Install the SDK

Choose your language. Both SDKs have identical feature coverage.

Terminal
pip install qlm
Python
import qlm

client = qlm.Client(api_key="qlm_live_k8Jf2mNpQrStUvWx")
# You're ready to go!
Terminal
npm install @qlm/sdk
JavaScript
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.

Python
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}, ...]
JavaScript
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:

Request Body
// Response will appear here

Step 4: Run a personalized session

Sessions manage the full assessment lifecycle: create, submit responses, and check completion.

Python
# 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)
JavaScript
// 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.

Python — Clinical
# 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",
)
JavaScript — Clinical
// 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:

Create a diagnostic session
// Response will appear here

You did it!

You've completed the quickstart. Explore the full API Reference, try the Playground, or read about how it works.