{
 "openapi": "3.1.0",
 "info": {
  "title": "willem.com (machine edition)",
  "version": "2026-09-11",
  "summary": "The willem.com corpus, structured for software that reads.",
  "description": "A machine-first representation of willem.com: the same corpus, restructured for software that reads. Unstyled semantic HTML, plus JSON and markdown for every surface. Published by the same Lemmid Manager content that builds the human site. The human edition is https://willem.com and is the version to cite: every record carries its source_url.",
  "contact": {
   "name": "Willem L. Middelkoop",
   "url": "https://willem.com"
  },
  "license": {
   "name": "Quote freely with attribution and a link to the source_url."
  }
 },
 "servers": [
  {
   "url": "https://agents.willem.com"
  }
 ],
 "paths": {
  "/index.json": {
   "get": {
    "summary": "Endpoint manifest",
    "description": "Every endpoint on this site with its media type, plus the conventions that govern the records.",
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {}
      }
     }
    }
   }
  },
  "/en/posts.json": {
   "get": {
    "summary": "All posts (English), metadata only",
    "description": "One record per post: title, date, topics, summary, canonical willem.com URL. No body text.",
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {}
      }
     }
    }
   }
  },
  "/en/corpus.json": {
   "get": {
    "summary": "All posts (English), full text",
    "description": "The entire corpus in one request, including body text and described images.",
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {}
      }
     }
    }
   }
  },
  "/en/corpus.md": {
   "get": {
    "summary": "All posts (English) as one markdown document",
    "description": "The same corpus as markdown, for direct inclusion in a context window.",
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "text/markdown": {}
      }
     }
    }
   }
  },
  "/en/topics.json": {
   "get": {
    "summary": "Topics (English)",
    "description": "Every topic with the posts filed under it.",
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {}
      }
     }
    }
   }
  },
  "/en/questions.json": {
   "get": {
    "summary": "Questions (English)",
    "description": "Questions the corpus answers, each with its answer, the origin of that answer, and its sources.",
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {}
      }
     }
    }
   }
  },
  "/en/snippets.json": {
   "get": {
    "summary": "Snippets (English)",
    "description": "Short distillations of the long posts, not published on willem.com itself.",
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {}
      }
     }
    }
   }
  },
  "/en/images.json": {
   "get": {
    "summary": "Image catalogue (English)",
    "description": "Every image on the blog with its description, from the author where one exists and otherwise from a vision model, plus text transcribed from inside the picture.",
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {}
      }
     }
    }
   }
  },
  "/en/feed.rss": {
   "get": {
    "summary": "RSS feed (English)",
    "description": "Newest 50 posts, full text.",
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/rss+xml": {}
      }
     }
    }
   }
  },
  "/en/feed.atom": {
   "get": {
    "summary": "Atom feed (English)",
    "description": "Newest 50 posts, full text.",
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/atom+xml": {}
      }
     }
    }
   }
  },
  "/en/posts/{slug}/post.json": {
   "get": {
    "summary": "One post (English)",
    "description": "A single post with its full text.",
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {}
      }
     }
    }
   }
  },
  "/en/posts/{slug}/post.md": {
   "get": {
    "summary": "One post as markdown (English)",
    "description": "A single post as markdown.",
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "text/markdown": {}
      }
     }
    }
   }
  },
  "/en/snippets/{slug}/snippet.json": {
   "get": {
    "summary": "One snippet (English)",
    "description": "A single distillation.",
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {}
      }
     }
    }
   }
  },
  "/nl/posts.json": {
   "get": {
    "summary": "All posts (Nederlands), metadata only",
    "description": "One record per post: title, date, topics, summary, canonical willem.com URL. No body text.",
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {}
      }
     }
    }
   }
  },
  "/nl/corpus.json": {
   "get": {
    "summary": "All posts (Nederlands), full text",
    "description": "The entire corpus in one request, including body text and described images.",
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {}
      }
     }
    }
   }
  },
  "/nl/corpus.md": {
   "get": {
    "summary": "All posts (Nederlands) as one markdown document",
    "description": "The same corpus as markdown, for direct inclusion in a context window.",
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "text/markdown": {}
      }
     }
    }
   }
  },
  "/nl/topics.json": {
   "get": {
    "summary": "Topics (Nederlands)",
    "description": "Every topic with the posts filed under it.",
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {}
      }
     }
    }
   }
  },
  "/nl/questions.json": {
   "get": {
    "summary": "Questions (Nederlands)",
    "description": "Questions the corpus answers, each with its answer, the origin of that answer, and its sources.",
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {}
      }
     }
    }
   }
  },
  "/nl/snippets.json": {
   "get": {
    "summary": "Snippets (Nederlands)",
    "description": "Short distillations of the long posts, not published on willem.com itself.",
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {}
      }
     }
    }
   }
  },
  "/nl/images.json": {
   "get": {
    "summary": "Image catalogue (Nederlands)",
    "description": "Every image on the blog with its description, from the author where one exists and otherwise from a vision model, plus text transcribed from inside the picture.",
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {}
      }
     }
    }
   }
  },
  "/nl/feed.rss": {
   "get": {
    "summary": "RSS feed (Nederlands)",
    "description": "Newest 50 posts, full text.",
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/rss+xml": {}
      }
     }
    }
   }
  },
  "/nl/feed.atom": {
   "get": {
    "summary": "Atom feed (Nederlands)",
    "description": "Newest 50 posts, full text.",
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/atom+xml": {}
      }
     }
    }
   }
  },
  "/nl/posts/{slug}/post.json": {
   "get": {
    "summary": "One post (Nederlands)",
    "description": "A single post with its full text.",
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {}
      }
     }
    }
   }
  },
  "/nl/posts/{slug}/post.md": {
   "get": {
    "summary": "One post as markdown (Nederlands)",
    "description": "A single post as markdown.",
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "text/markdown": {}
      }
     }
    }
   }
  },
  "/nl/snippets/{slug}/snippet.json": {
   "get": {
    "summary": "One snippet (Nederlands)",
    "description": "A single distillation.",
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {}
      }
     }
    }
   }
  }
 }
}