Edward Fleming
← index
§API — reference

API

Read-only JSON endpoints over the same content that renders this site — themes, threads, hypotheses, and elements. All GET, all public, no auth. Responses are statically generated at build time.

GET /api/themes

List published themes

Every published theme, with its threads, hypotheses, and elements nested inline.

example response
[
  {
    "label": "career",
    "name": "Career",
    "slug": "career",
    "description": "...",
    "status": "active",
    "published": true,
    "url": "https://edwardfleming.org/",
    "threads": [
      {
        "name": "Career Path Skill Tree",
        "slug": "career-path-skill-tree",
        "status": "active",
        "postCount": 3,
        "url": "https://edwardfleming.org/threads/career-path-skill-tree",
        "hypotheses": [
          {
            "name": "...",
            "slug": "...",
            "status": "open",
            "url": "https://edwardfleming.org/threads/career-path-skill-tree",
            "elements": [
              {
                "type": "observations",
                "name": "...",
                "slug": "...",
                "content": "...",
                "url": "https://edwardfleming.org/threads/career-path-skill-tree#..."
              }
            ]
          }
        ]
      }
    ]
  }
]
GET /api/themes/[slug]

Get a single theme

Same shape as one entry from /api/themes. 404s if the slug doesn't exist.

example response
{
  "label": "career",
  "name": "Career",
  "slug": "career",
  "description": "...",
  "status": "active",
  "published": true,
  "url": "https://edwardfleming.org/",
  "threads": [ /* ... */ ]
}
GET /api/threads

List all threads

Every thread across published themes, flattened into a single array. Each thread carries a summary of its parent theme.

example response
[
  {
    "name": "Career Path Skill Tree",
    "slug": "career-path-skill-tree",
    "status": "active",
    "postCount": 3,
    "url": "https://edwardfleming.org/threads/career-path-skill-tree",
    "hypotheses": [ /* ... */ ],
    "theme": {
      "label": "career",
      "name": "Career",
      "slug": "career",
      "status": "active",
      "url": "https://edwardfleming.org/"
    }
  }
]
GET /api/threads/[slug]

Get a single thread

The thread and its parent theme summary, returned separately. 404s if the slug doesn't exist.

example response
{
  "theme": {
    "label": "career",
    "name": "Career",
    "slug": "career",
    "status": "active",
    "url": "https://edwardfleming.org/"
  },
  "thread": {
    "name": "Career Path Skill Tree",
    "slug": "career-path-skill-tree",
    "status": "active",
    "postCount": 3,
    "url": "https://edwardfleming.org/threads/career-path-skill-tree",
    "hypotheses": [ /* ... */ ]
  }
}
notes
  • Only published themes and their threads are included in list endpoints.
  • Every node includes a urlfield pointing at the page a visitor would see it on — an element's url points at its source page if it has one, otherwise its thread anchor.
  • Unknown slugs return 404 with { "error": "..." }.
  • No authentication is required or supported. This is declared machine-readably via /.well-known/oauth-protected-resource (RFC 9728), whose authorization_servers list is empty — there is no authorization server protecting this API.