{
  "openapi": "3.1.0",
  "info": {
    "title": "The AI Career Lab API",
    "version": "1.0.0",
    "summary": "Read-only catalog of profession-specific AI tools, Claude Cowork plugins, packs, and guides.",
    "description": "Public, unauthenticated, read-only JSON API for The AI Career Lab (theaicareerlab.com). Use it to look up which AI tools, free Claude Cowork plugins, paid packs, and guides exist for a given profession. All responses are CORS-open and CDN-cached for one hour. Errors are RFC 9457 problem documents. Every HTML page on the site also serves Markdown when requested with `Accept: text/markdown`.",
    "termsOfService": "https://theaicareerlab.com/terms",
    "contact": {
      "name": "The AI Career Lab",
      "url": "https://theaicareerlab.com/support",
      "email": "hello@theaicareerlab.com"
    },
    "license": {
      "name": "Content © The AI Career Lab; API responses may be cached and quoted with attribution.",
      "url": "https://theaicareerlab.com/terms"
    },
    "x-logo": {
      "url": "https://theaicareerlab.com/logo.png"
    }
  },
  "externalDocs": {
    "description": "Human-readable API documentation",
    "url": "https://theaicareerlab.com/developers/api"
  },
  "servers": [
    {
      "url": "https://theaicareerlab.com",
      "description": "Production"
    }
  ],
  "tags": [
    {
      "name": "Professions",
      "description": "The 40+ professions the site is organized around."
    },
    {
      "name": "Tools",
      "description": "Free browser-based AI tools, one profession each."
    },
    {
      "name": "Plugins",
      "description": "Free open-source Claude Cowork / Claude Code plugins."
    },
    {
      "name": "Products",
      "description": "Paid profession packs sold on Gumroad."
    },
    {
      "name": "Posts",
      "description": "Guides, comparisons, and weekly AI digests."
    },
    {
      "name": "Search",
      "description": "Keyword search across the whole catalog."
    }
  ],
  "paths": {
    "/api/v1": {
      "get": {
        "operationId": "getApiIndex",
        "tags": [
          "Search"
        ],
        "summary": "API index",
        "description": "Lists every collection endpoint with a description, plus links to the OpenAPI document and docs.",
        "responses": {
          "200": {
            "description": "Index of endpoints.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/categories": {
      "get": {
        "operationId": "listCategories",
        "tags": [
          "Professions"
        ],
        "summary": "List profession categories",
        "description": "Returns the industry categories professions are grouped into, with counts.",
        "responses": {
          "200": {
            "description": "Categories.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "items"
                  ],
                  "properties": {
                    "items": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Category"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/professions": {
      "get": {
        "operationId": "listProfessions",
        "tags": [
          "Professions"
        ],
        "summary": "List professions",
        "description": "Returns every profession with its tool count, free plugin slug, paid pack (if shipped), and waitlist URL (if not).",
        "parameters": [
          {
            "name": "category",
            "in": "query",
            "required": false,
            "description": "Filter by category id (see listCategories).",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Professions.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "items",
                    "total"
                  ],
                  "properties": {
                    "items": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/ProfessionSummary"
                      }
                    },
                    "total": {
                      "type": "integer",
                      "description": "Total professions returned."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Unknown category.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/professions/{slug}": {
      "get": {
        "operationId": "getProfession",
        "tags": [
          "Professions"
        ],
        "summary": "Get a profession",
        "description": "Full profile for one profession: pain points, AI use cases, its free tools, its plugin, and related posts.",
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "description": "Profession slug, e.g. `real-estate`.",
            "schema": {
              "type": "string",
              "pattern": "^[a-z0-9-]+$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Profession detail.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProfessionDetail"
                }
              }
            }
          },
          "404": {
            "description": "No profession with that slug.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools": {
      "get": {
        "operationId": "listTools",
        "tags": [
          "Tools"
        ],
        "summary": "List tools",
        "description": "Returns free AI tools, optionally filtered to one profession.",
        "parameters": [
          {
            "name": "profession",
            "in": "query",
            "required": false,
            "description": "Profession slug to filter by.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Tools.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "items",
                    "total"
                  ],
                  "properties": {
                    "items": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/ToolSummary"
                      }
                    },
                    "total": {
                      "type": "integer",
                      "description": "Total tools returned."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Unknown profession.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/{slug}": {
      "get": {
        "operationId": "getTool",
        "tags": [
          "Tools"
        ],
        "summary": "Get a tool",
        "description": "Full detail for one tool, including features, related tools, and how to run it.",
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "description": "Tool slug.",
            "schema": {
              "type": "string",
              "pattern": "^[a-z0-9-]+$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Tool detail.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ToolDetail"
                }
              }
            }
          },
          "404": {
            "description": "No tool with that slug.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/plugins": {
      "get": {
        "operationId": "listPlugins",
        "tags": [
          "Plugins"
        ],
        "summary": "List plugins",
        "description": "Returns every free open-source Claude Cowork / Claude Code plugin with its install command.",
        "responses": {
          "200": {
            "description": "Plugins.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "items",
                    "total"
                  ],
                  "properties": {
                    "items": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/PluginSummary"
                      }
                    },
                    "total": {
                      "type": "integer",
                      "description": "Total plugins."
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/plugins/{slug}": {
      "get": {
        "operationId": "getPlugin",
        "tags": [
          "Plugins"
        ],
        "summary": "Get a plugin",
        "description": "Full detail for one plugin: commands, skills, and usage examples.",
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "description": "Plugin slug.",
            "schema": {
              "type": "string",
              "pattern": "^[a-z0-9-]+$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Plugin detail.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PluginDetail"
                }
              }
            }
          },
          "404": {
            "description": "No plugin with that slug.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/products": {
      "get": {
        "operationId": "listProducts",
        "tags": [
          "Products"
        ],
        "summary": "List products",
        "description": "Returns every paid pack and bundle with USD price and checkout URL. Every paid pack ships as a Claude Cowork plugin plus all prompts as HTML usable in any AI tool.",
        "responses": {
          "200": {
            "description": "Products.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "items",
                    "total"
                  ],
                  "properties": {
                    "items": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Product"
                      }
                    },
                    "total": {
                      "type": "integer",
                      "description": "Total products."
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/posts": {
      "get": {
        "operationId": "listPosts",
        "tags": [
          "Posts"
        ],
        "summary": "List posts",
        "description": "Returns blog posts newest-first, optionally filtered by profession slug or category.",
        "parameters": [
          {
            "name": "profession",
            "in": "query",
            "required": false,
            "description": "Profession slug.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "category",
            "in": "query",
            "required": false,
            "description": "Editorial category.",
            "schema": {
              "type": "string",
              "enum": [
                "guide",
                "how-to",
                "comparison",
                "industry-news"
              ]
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Maximum items to return (1–200, default 50).",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200,
              "default": 50
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Posts.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "items",
                    "total"
                  ],
                  "properties": {
                    "items": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/PostSummary"
                      }
                    },
                    "total": {
                      "type": "integer",
                      "description": "Posts returned."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Invalid parameter.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/posts/{slug}": {
      "get": {
        "operationId": "getPost",
        "tags": [
          "Posts"
        ],
        "summary": "Get a post",
        "description": "One post with its full Markdown body and FAQ.",
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "description": "Post slug.",
            "schema": {
              "type": "string",
              "pattern": "^[a-z0-9-]+$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Post detail.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PostDetail"
                }
              }
            }
          },
          "404": {
            "description": "No post with that slug.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/search": {
      "get": {
        "operationId": "search",
        "tags": [
          "Search"
        ],
        "summary": "Search the catalog",
        "description": "Case-insensitive keyword search across professions, tools, plugins, and posts.",
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "required": true,
            "description": "Search terms (1–100 characters).",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 100
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Maximum items to return (1–100, default 25).",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 25
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Search results.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "query",
                    "items",
                    "total"
                  ],
                  "properties": {
                    "query": {
                      "type": "string",
                      "description": "Echoed query."
                    },
                    "items": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/SearchResult"
                      }
                    },
                    "total": {
                      "type": "integer",
                      "description": "Results returned."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Missing or invalid `q`.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Problem": {
        "type": "object",
        "description": "RFC 9457 problem details. Every error response uses this shape with content type application/problem+json.",
        "required": [
          "type",
          "title",
          "status",
          "detail",
          "code",
          "resolution"
        ],
        "properties": {
          "type": {
            "type": "string",
            "format": "uri",
            "description": "URI identifying the problem type."
          },
          "title": {
            "type": "string",
            "description": "Short human-readable summary."
          },
          "status": {
            "type": "integer",
            "description": "HTTP status code."
          },
          "detail": {
            "type": "string",
            "description": "Explanation specific to this occurrence."
          },
          "instance": {
            "type": [
              "string",
              "null"
            ],
            "description": "Request path that produced the problem."
          },
          "code": {
            "type": "string",
            "description": "Stable machine-readable code.",
            "enum": [
              "not_found",
              "api_route_not_found",
              "invalid_parameter",
              "method_not_allowed"
            ]
          },
          "resolution": {
            "type": "string",
            "description": "What to do next."
          }
        }
      },
      "Pack": {
        "type": "object",
        "description": "A paid profession pack. Every paid pack ships as a Claude Cowork plugin plus all prompts as HTML usable in any AI tool.",
        "required": [
          "slug",
          "name",
          "priceUsd",
          "url",
          "format"
        ],
        "properties": {
          "slug": {
            "type": "string",
            "description": "Catalog slug."
          },
          "name": {
            "type": "string",
            "description": "Display name."
          },
          "priceUsd": {
            "type": "number",
            "description": "List price in USD. Gumroad applies purchasing-power-parity pricing at checkout in eligible countries."
          },
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Checkout URL on Gumroad."
          },
          "format": {
            "type": "string",
            "description": "Delivery format."
          }
        }
      },
      "Category": {
        "type": "object",
        "required": [
          "id",
          "label",
          "professionCount"
        ],
        "properties": {
          "id": {
            "type": "string",
            "description": "Category id."
          },
          "label": {
            "type": "string",
            "description": "Display label."
          },
          "professionCount": {
            "type": "integer",
            "description": "Professions in this category."
          }
        }
      },
      "ProfessionSummary": {
        "type": "object",
        "required": [
          "id",
          "slug",
          "name",
          "pluralName",
          "tagline",
          "category",
          "url",
          "toolCount",
          "pluginSlug",
          "pack",
          "waitlistUrl"
        ],
        "properties": {
          "id": {
            "type": "string",
            "description": "Stable profession id."
          },
          "slug": {
            "type": "string",
            "description": "URL slug, e.g. `real-estate`."
          },
          "name": {
            "type": "string",
            "description": "Singular name, e.g. `Real Estate Agent`."
          },
          "pluralName": {
            "type": "string",
            "description": "Plural name."
          },
          "tagline": {
            "type": "string",
            "description": "One-line positioning."
          },
          "category": {
            "type": "object",
            "required": [
              "id",
              "label"
            ],
            "properties": {
              "id": {
                "type": "string",
                "description": "Category id."
              },
              "label": {
                "type": "string",
                "description": "Category label."
              }
            }
          },
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Profession hub page."
          },
          "toolCount": {
            "type": "integer",
            "description": "Number of free tools for this profession."
          },
          "pluginSlug": {
            "type": [
              "string",
              "null"
            ],
            "description": "Slug of the free open-source Claude Cowork plugin, when one exists."
          },
          "pack": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/Pack"
              },
              {
                "type": "null"
              }
            ],
            "description": "Paid pack, when one has shipped."
          },
          "waitlistUrl": {
            "type": [
              "string",
              "null"
            ],
            "description": "Waitlist page when no pack has shipped yet."
          }
        }
      },
      "ProfessionDetail": {
        "allOf": [
          {
            "$ref": "#/components/schemas/ProfessionSummary"
          },
          {
            "type": "object",
            "required": [
              "description",
              "stats",
              "painPoints",
              "aiUseCases",
              "tools",
              "plugin",
              "posts"
            ],
            "properties": {
              "description": {
                "type": "string",
                "description": "Long description."
              },
              "stats": {
                "type": "object",
                "properties": {
                  "practitioners": {
                    "type": "string",
                    "description": "Workforce size."
                  },
                  "medianIncome": {
                    "type": "string",
                    "description": "Median income."
                  },
                  "growthRate": {
                    "type": "string",
                    "description": "Growth rate."
                  }
                }
              },
              "painPoints": {
                "type": "array",
                "items": {
                  "type": "object",
                  "required": [
                    "title",
                    "description"
                  ],
                  "properties": {
                    "title": {
                      "type": "string",
                      "description": "Pain point."
                    },
                    "description": {
                      "type": "string",
                      "description": "Detail."
                    },
                    "hoursPerWeek": {
                      "type": "string",
                      "description": "Hours lost per week."
                    }
                  }
                }
              },
              "aiUseCases": {
                "type": "array",
                "items": {
                  "type": "object",
                  "required": [
                    "title",
                    "description",
                    "timeSaved"
                  ],
                  "properties": {
                    "title": {
                      "type": "string",
                      "description": "Use case."
                    },
                    "description": {
                      "type": "string",
                      "description": "Detail."
                    },
                    "timeSaved": {
                      "type": "string",
                      "description": "Estimated time saved."
                    }
                  }
                }
              },
              "tools": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/ToolSummary"
                }
              },
              "plugin": {
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/PluginSummary"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "posts": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/PostSummary"
                }
              }
            }
          }
        ]
      },
      "ToolSummary": {
        "type": "object",
        "required": [
          "slug",
          "name",
          "description",
          "professionId",
          "professionSlug",
          "url",
          "isFree",
          "estimatedTime",
          "timeSaved",
          "dataClassification",
          "isPopular"
        ],
        "properties": {
          "slug": {
            "type": "string",
            "description": "Tool slug."
          },
          "name": {
            "type": "string",
            "description": "Tool name."
          },
          "description": {
            "type": "string",
            "description": "What the tool produces."
          },
          "professionId": {
            "type": "string",
            "description": "Owning profession id."
          },
          "professionSlug": {
            "type": [
              "string",
              "null"
            ],
            "description": "Owning profession slug."
          },
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Tool page (runs in the browser)."
          },
          "isFree": {
            "type": "boolean",
            "description": "Always true — every tool is free."
          },
          "estimatedTime": {
            "type": [
              "string",
              "null"
            ],
            "description": "Typical run time, e.g. `~10 seconds`."
          },
          "timeSaved": {
            "type": [
              "string",
              "null"
            ],
            "description": "Manual time saved, e.g. `~45 minutes`."
          },
          "dataClassification": {
            "type": "string",
            "description": "Input sensitivity class.",
            "enum": [
              "clinical",
              "legal",
              "financial",
              "general"
            ]
          },
          "isPopular": {
            "type": "boolean",
            "description": "Popular badge on the catalog."
          }
        }
      },
      "ToolDetail": {
        "allOf": [
          {
            "$ref": "#/components/schemas/ToolSummary"
          },
          {
            "type": "object",
            "required": [
              "pageDescription",
              "features",
              "relatedTools",
              "hubs",
              "runRequires"
            ],
            "properties": {
              "pageDescription": {
                "type": "string",
                "description": "Longer description."
              },
              "features": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "Feature checklist."
              },
              "relatedTools": {
                "type": "array",
                "items": {
                  "type": "object",
                  "required": [
                    "slug",
                    "url"
                  ],
                  "properties": {
                    "slug": {
                      "type": "string",
                      "description": "Related tool slug."
                    },
                    "url": {
                      "type": "string",
                      "format": "uri",
                      "description": "Related tool page."
                    }
                  }
                }
              },
              "hubs": {
                "type": "array",
                "items": {
                  "type": "object",
                  "required": [
                    "label",
                    "url"
                  ],
                  "properties": {
                    "label": {
                      "type": "string",
                      "description": "Hub label."
                    },
                    "url": {
                      "type": "string",
                      "format": "uri",
                      "description": "Hub page."
                    }
                  }
                }
              },
              "runRequires": {
                "type": "string",
                "description": "How to run the tool."
              }
            }
          }
        ]
      },
      "PluginSummary": {
        "type": "object",
        "required": [
          "slug",
          "name",
          "professionId",
          "professionSlug",
          "tagline",
          "category",
          "url",
          "repoUrl",
          "installCommand",
          "commandCount",
          "skillCount"
        ],
        "properties": {
          "slug": {
            "type": "string",
            "description": "Plugin slug."
          },
          "name": {
            "type": "string",
            "description": "Plugin name."
          },
          "professionId": {
            "type": "string",
            "description": "Owning profession id."
          },
          "professionSlug": {
            "type": [
              "string",
              "null"
            ],
            "description": "Owning profession slug."
          },
          "tagline": {
            "type": "string",
            "description": "One-line summary."
          },
          "category": {
            "type": "string",
            "description": "Plugin category."
          },
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Plugin page with install instructions."
          },
          "repoUrl": {
            "type": "string",
            "format": "uri",
            "description": "Open-source repository."
          },
          "installCommand": {
            "type": "string",
            "description": "Claude Code install command."
          },
          "commandCount": {
            "type": "integer",
            "description": "Slash commands included."
          },
          "skillCount": {
            "type": "integer",
            "description": "Skills included."
          }
        }
      },
      "PluginDetail": {
        "allOf": [
          {
            "$ref": "#/components/schemas/PluginSummary"
          },
          {
            "type": "object",
            "required": [
              "description",
              "commands",
              "skills",
              "usageExamples"
            ],
            "properties": {
              "description": {
                "type": "string",
                "description": "Long description."
              },
              "commands": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "string",
                      "description": "Command name."
                    },
                    "description": {
                      "type": "string",
                      "description": "What it does."
                    }
                  },
                  "additionalProperties": true
                }
              },
              "skills": {
                "type": "array",
                "items": {
                  "type": "object",
                  "required": [
                    "name",
                    "description"
                  ],
                  "properties": {
                    "name": {
                      "type": "string",
                      "description": "Skill name."
                    },
                    "description": {
                      "type": "string",
                      "description": "What it does."
                    }
                  }
                }
              },
              "usageExamples": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              }
            }
          }
        ]
      },
      "Product": {
        "type": "object",
        "description": "A product on the shop. Every paid pack ships as a Claude Cowork plugin plus all prompts as HTML usable in any AI tool.",
        "required": [
          "slug",
          "name",
          "blurb",
          "priceUsd",
          "priceDisplay",
          "skillCount",
          "category",
          "url",
          "format"
        ],
        "properties": {
          "slug": {
            "type": "string",
            "description": "Catalog slug."
          },
          "name": {
            "type": "string",
            "description": "Display name."
          },
          "blurb": {
            "type": "string",
            "description": "One-line pitch."
          },
          "priceUsd": {
            "type": "number",
            "description": "List price in USD."
          },
          "priceDisplay": {
            "type": "string",
            "description": "Formatted price, e.g. `$19` or `$79+`."
          },
          "skillCount": {
            "type": "integer",
            "description": "Agentic skills included."
          },
          "category": {
            "type": "string",
            "description": "Shop grouping.",
            "enum": [
              "real-estate",
              "finance",
              "office",
              "trades",
              "creative",
              "bundle"
            ]
          },
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Checkout URL on Gumroad."
          },
          "format": {
            "type": "string",
            "description": "Delivery format."
          }
        }
      },
      "PostSummary": {
        "type": "object",
        "required": [
          "slug",
          "title",
          "description",
          "category",
          "profession",
          "tags",
          "publishedAt",
          "updatedAt",
          "lastReviewedAt",
          "readingTime",
          "url",
          "markdownUrl"
        ],
        "properties": {
          "slug": {
            "type": "string",
            "description": "Post slug."
          },
          "title": {
            "type": "string",
            "description": "Title."
          },
          "description": {
            "type": "string",
            "description": "Summary."
          },
          "category": {
            "type": "string",
            "description": "Editorial category.",
            "enum": [
              "guide",
              "how-to",
              "comparison",
              "industry-news"
            ]
          },
          "profession": {
            "type": [
              "string",
              "null"
            ],
            "description": "Profession slug when profession-specific."
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "publishedAt": {
            "type": "string",
            "description": "ISO date first published.",
            "format": "date"
          },
          "updatedAt": {
            "type": [
              "string",
              "null"
            ],
            "description": "ISO date last updated."
          },
          "lastReviewedAt": {
            "type": [
              "string",
              "null"
            ],
            "description": "ISO date the author last re-verified the content."
          },
          "readingTime": {
            "type": [
              "string",
              "null"
            ],
            "description": "e.g. `8 min read`."
          },
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Rendered article."
          },
          "markdownUrl": {
            "type": "string",
            "format": "uri",
            "description": "Clean text/markdown version — preferred for AI ingestion."
          }
        }
      },
      "PostDetail": {
        "allOf": [
          {
            "$ref": "#/components/schemas/PostSummary"
          },
          {
            "type": "object",
            "required": [
              "content",
              "faq"
            ],
            "properties": {
              "content": {
                "type": "string",
                "description": "Full article body as Markdown."
              },
              "faq": {
                "type": "array",
                "items": {
                  "type": "object",
                  "required": [
                    "question",
                    "answer"
                  ],
                  "properties": {
                    "question": {
                      "type": "string",
                      "description": "Question."
                    },
                    "answer": {
                      "type": "string",
                      "description": "Answer."
                    }
                  }
                }
              }
            }
          }
        ]
      },
      "SearchResult": {
        "type": "object",
        "required": [
          "type",
          "slug",
          "title",
          "description",
          "url"
        ],
        "properties": {
          "type": {
            "type": "string",
            "description": "Result kind.",
            "enum": [
              "profession",
              "tool",
              "plugin",
              "post"
            ]
          },
          "slug": {
            "type": "string",
            "description": "Slug within its kind."
          },
          "title": {
            "type": "string",
            "description": "Title."
          },
          "description": {
            "type": "string",
            "description": "Summary."
          },
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Canonical page."
          }
        }
      }
    }
  }
}