{
  "schemaVersion": "2026-06-26",
  "name": "IndieStore Public API Catalog",
  "description": "Public read APIs for discovering IndieStore products, founder profiles, blog posts, and social-style product posts.",
  "publisher": {
    "name": "IndieStore",
    "url": "https://indiestore.co"
  },
  "baseUrl": "https://indiestore.co",
  "robots": "https://indiestore.co/robots.txt",
  "llms": "https://indiestore.co/llms.txt",
  "contact": {
    "website": "https://indiestore.co/submit-tool"
  },
  "authentication": {
    "required": false,
    "notes": "Public discovery endpoints are read-only. Private checkout, auth, account, admin, and webhook endpoints are intentionally excluded."
  },
  "endpoints": [
    {
      "name": "Product summaries",
      "method": "GET",
      "path": "/api/products",
      "description": "Returns active product summaries with slug, name, icon, category, URL, and short description.",
      "useCases": ["product discovery", "directory indexing", "comparison research"],
      "public": true
    },
    {
      "name": "Product detail",
      "method": "GET",
      "path": "/api/products/{slug}",
      "description": "Returns one product profile plus similar product summaries.",
      "parameters": [
        {
          "name": "slug",
          "in": "path",
          "required": true,
          "description": "Product slug from the public product listing."
        }
      ],
      "public": true
    },
    {
      "name": "Founder summaries",
      "method": "GET",
      "path": "/api/founders",
      "description": "Returns public founder profile summaries.",
      "useCases": ["founder research", "indie maker discovery"],
      "public": true
    },
    {
      "name": "Blog posts",
      "method": "GET",
      "path": "/api/blogs",
      "description": "Returns paginated blog summaries.",
      "parameters": [
        {
          "name": "page",
          "in": "query",
          "required": false,
          "description": "Page number, starting at 1."
        },
        {
          "name": "category",
          "in": "query",
          "required": false,
          "description": "Optional blog category filter."
        }
      ],
      "public": true
    },
    {
      "name": "Blog detail",
      "method": "GET",
      "path": "/api/blogs/{slug}",
      "description": "Returns a public blog post by slug.",
      "parameters": [
        {
          "name": "slug",
          "in": "path",
          "required": true,
          "description": "Blog post slug."
        }
      ],
      "public": true
    },
    {
      "name": "Product posts",
      "method": "GET",
      "path": "/api/posts",
      "description": "Returns a paginated feed of short product discovery posts.",
      "parameters": [
        {
          "name": "offset",
          "in": "query",
          "required": false,
          "description": "Pagination offset."
        }
      ],
      "public": true
    }
  ],
  "excludedSurfaces": [
    "/api/auth",
    "/api/payments",
    "/api/webhooks",
    "/admin",
    "/account",
    "/checkout"
  ]
}
