API documentation

REST API for quiz metadata, questions, and your key's usage. Stable contract under the /api/v1/ prefix.

Authentication

Pass your API key as a Bearer token, or in the X-API-Key header. Create a key from your developer dashboard.

Authorization: Bearer my_xxxxxxxxxxxxxxxx
# or
X-API-Key: my_xxxxxxxxxxxxxxxx

Rate limits

  • Per-minute window: 1,000 requests (default key)
  • Daily quota: 10,000 requests (default key)
  • A blocked request returns 429 with a Retry-After header. Check /api/v1/usage for live counts.

Endpoints

  • GET /api/v1/quizzes

    List all published quizzes

    Example response
    {
      "quizzes": [
        {
          "slug": "big-five-ocean",
          "category": "personality",
          "title": "Big Five Personality Test",
          "description": "...",
          "estimated_minutes": 10,
          "is_pro_only": false
        },
        ...
      ]
    }
  • GET /api/v1/quizzes/{slug}

    Full quiz: dimensions, questions, answer options

    Example response
    {
      "slug": "big-five-ocean",
      "title": "Big Five Personality Test",
      "dimensions": [
        {"key": "openness", "label": "Openness", "description": "...", "sort_order": 0},
        ...
      ],
      "questions": [
        {"text": "I have a vivid imagination.", "dimension": "openness", "sort_order": 0, "is_reverse_scored": false},
        ...
      ],
      "options": [
        {"label": "Strongly Disagree", "value": 1},
        {"label": "Disagree", "value": 2},
        ...
      ]
    }
  • GET /api/v1/usage

    Your key's current rate-limit and daily-quota usage

    Example response
    {
      "rate_limit_per_minute": 1000,
      "rate_limit_used": 12,
      "daily_quota": 10000,
      "daily_used": 248,
      "as_of": "2026-05-28T18:23:01+00:00"
    }

Code samples

Python

import os
import requests

API_KEY = os.environ["MY_API_KEY"]
BASE = "https://api-staging.mytraits.me/api/v1"

def list_quizzes():
    r = requests.get(
        f"{BASE}/quizzes",
        headers={"Authorization": f"Bearer {API_KEY}"},
        timeout=10,
    )
    r.raise_for_status()
    return r.json()["quizzes"]

if __name__ == "__main__":
    for q in list_quizzes():
        print(f"{q['slug']:30s} {q['title']}")

JavaScript

const API_KEY = process.env.MY_API_KEY;
const BASE = "https://api-staging.mytraits.me/api/v1";

async function listQuizzes() {
  const res = await fetch(`${BASE}/quizzes`, {
    headers: { Authorization: `Bearer ${API_KEY}` },
  });
  if (!res.ok) throw new Error(`HTTP ${res.status}`);
  const data = await res.json();
  return data.quizzes;
}

listQuizzes().then((quizzes) => {
  for (const q of quizzes) console.log(q.slug, q.title);
});

cURL

curl -H "Authorization: Bearer $MY_API_KEY" \
  https://api-staging.mytraits.me/api/v1/quizzes

OpenAPI 3.1 spec

The live machine-readable spec is generated from FastAPI at https://api-staging.mytraits.me/openapi.json. Import it into Postman, Insomnia, or your favorite codegen tool.