{
  "name": "bshp.io public read API",
  "version": "v1",
  "description": "Read-only JSON for Ben Bishop's portfolio site. No API keys. Contact form is separate and origin-restricted.",
  "site": "https://bshp.io",
  "documentation": "https://bshp.io/developers",
  "openapi": "https://bshp.io/openapi.json",
  "llmsTxt": "https://bshp.io/llms.txt",
  "pathNote": "Canonical extensionless paths (/api/v1/projects) rewrite to static *.json files on Cloudflare Pages. Direct *.json URLs always work (including local preview).",
  "endpoints": {
    "projects": {
      "list": "https://bshp.io/api/v1/projects",
      "listJson": "https://bshp.io/api/v1/projects.json",
      "item": "https://bshp.io/api/v1/projects/{slug}",
      "itemJson": "https://bshp.io/api/v1/projects/{slug}.json"
    },
    "articles": {
      "list": "https://bshp.io/api/v1/articles",
      "listJson": "https://bshp.io/api/v1/articles.json",
      "item": "https://bshp.io/api/v1/articles/{slug}",
      "itemJson": "https://bshp.io/api/v1/articles/{slug}.json",
      "note": "Published articles only; drafts are excluded."
    },
    "stack": {
      "get": "https://bshp.io/api/v1/stack",
      "getJson": "https://bshp.io/api/v1/stack.json"
    },
    "index": {
      "get": "https://bshp.io/api/v1",
      "getJson": "https://bshp.io/api/v1.json"
    }
  },
  "humanPages": {
    "home": "https://bshp.io/",
    "projects": "https://bshp.io/projects",
    "articles": "https://bshp.io/articles",
    "stack": "https://bshp.io/stack",
    "contact": "https://bshp.io/contact",
    "feed": "https://bshp.io/feed.xml",
    "sitemap": "https://bshp.io/sitemap-index.xml"
  },
  "contact": {
    "formPage": "https://bshp.io/contact",
    "post": "https://bshp.io/api/contact",
    "note": "POST /api/contact is a human contact form endpoint. It is origin-restricted and rate-limited. It is not a public integration API."
  }
}