{
  "openapi": "3.1.0",
  "info": {
    "title": "WFM Labs public API",
    "version": "1.0.0",
    "summary": "Read-only JSON descriptions of the WFM Labs practice, its services, and its writing.",
    "description": "A small, entirely public API over the content of wfmlabs.ai. There are no\nAPI keys, no accounts, and no rate-limited quotas on the read endpoints —\nsee https://wfmlabs.ai/auth.md.\n\nEverything under `/api/*.json` is a static file generated at build time and\nserved from the CDN, so it is cheap to poll and safe to cache. `POST /api/contact`\nis the one write endpoint; it is intended for a human filling in the form at\n/contact, not for autonomous submission by an agent.\n\nAn MCP server covering the same read surface is available at https://wfmlabs.ai/mcp\n(Streamable HTTP). Every HTML page also answers `Accept: text/markdown`.",
    "contact": {
      "name": "WFM Labs",
      "url": "https://wfmlabs.ai/contact"
    },
    "license": {
      "name": "Content usage preferences declared in robots.txt Content-Signal",
      "url": "https://wfmlabs.ai/robots.txt"
    }
  },
  "servers": [
    {
      "url": "https://wfmlabs.ai",
      "description": "Production"
    }
  ],
  "externalDocs": {
    "description": "API and agent interface documentation",
    "url": "https://wfmlabs.ai/docs/api"
  },
  "tags": [
    {
      "name": "practice",
      "description": "Who WFM Labs is and what it does"
    },
    {
      "name": "content",
      "description": "Published writing"
    },
    {
      "name": "operations",
      "description": "Service health"
    },
    {
      "name": "contact",
      "description": "Human-initiated inquiry"
    }
  ],
  "paths": {
    "/api/profile.json": {
      "get": {
        "tags": [
          "practice"
        ],
        "operationId": "getProfile",
        "summary": "Describe the practice, its scope, and how to make contact",
        "description": "The document to read first. Includes what is explicitly out of scope, so an agent can decide whether a referral here is appropriate.",
        "responses": {
          "200": {
            "description": "Practice description",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Profile"
                }
              }
            }
          }
        }
      }
    },
    "/api/services.json": {
      "get": {
        "tags": [
          "practice"
        ],
        "operationId": "listServices",
        "summary": "List the four service capabilities",
        "description": "These are broad capabilities, not a product catalog. Each entry carries the problems it addresses, typical deliverables, and an FAQ.",
        "responses": {
          "200": {
            "description": "Service catalog",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceList"
                }
              }
            }
          }
        }
      }
    },
    "/api/work.json": {
      "get": {
        "tags": [
          "practice"
        ],
        "operationId": "listCaseStudies",
        "summary": "List anonymized case studies",
        "description": "Evidence of capability, not a product catalog. Client names are never published — `client` is a generalized descriptor of industry and scale.",
        "responses": {
          "200": {
            "description": "Case studies",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CaseStudyList"
                }
              }
            }
          }
        }
      }
    },
    "/api/posts.json": {
      "get": {
        "tags": [
          "content"
        ],
        "operationId": "listPosts",
        "summary": "List published blog posts, newest first",
        "description": "Each entry includes `tldr`, a 40–60 word direct answer to the post’s core question, so an agent can answer without fetching the post. Full text of every post is in /llms-full.txt.",
        "responses": {
          "200": {
            "description": "Blog index",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PostList"
                }
              }
            }
          }
        }
      }
    },
    "/api/health": {
      "get": {
        "tags": [
          "operations"
        ],
        "operationId": "getHealth",
        "summary": "Service health",
        "description": "Referenced as the `status` relation in /.well-known/api-catalog.",
        "responses": {
          "200": {
            "description": "Healthy",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Health"
                }
              }
            }
          }
        }
      }
    },
    "/api/contact": {
      "post": {
        "tags": [
          "contact"
        ],
        "operationId": "submitInquiry",
        "summary": "Send an inquiry to Jeff (human-initiated)",
        "description": "Backs the form at /contact. The message is emailed to Jeff; nothing is stored.\n\nAgents: do not call this on a user’s behalf. Hand the human the /contact URL and let\nthem write and send it themselves — an inquiry is the opening of a business\nrelationship, and it should be the person’s own words and their own decision to send.\nThe MCP server at /mcp deliberately exposes no tool that reaches this endpoint.\n\nUnauthenticated but rate limited; submissions are validated and honeypotted.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Inquiry"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Accepted and sent",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Ok"
                }
              }
            }
          },
          "400": {
            "description": "Missing or invalid name, email, or message",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Err"
                }
              }
            }
          },
          "429": {
            "description": "Too many submissions from this address",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Err"
                }
              }
            }
          },
          "502": {
            "description": "Mail delivery failed",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Err"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Profile": {
        "type": "object",
        "required": [
          "practice",
          "services",
          "howToEngage"
        ],
        "properties": {
          "practice": {
            "type": "object",
            "description": "Identity, principal, background, and skills"
          },
          "disclaimer": {
            "type": "string",
            "description": "Independence from UKG Inc."
          },
          "expertise": {
            "type": "object",
            "description": "Depth claim, adjacent surfaces, and other first-class scope"
          },
          "services": {
            "type": "array",
            "items": {
              "type": "object"
            }
          },
          "selectedWork": {
            "type": "array",
            "description": "Anonymized case studies. Client names are never published.",
            "items": {
              "type": "object"
            }
          },
          "outOfScope": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "howToEngage": {
            "type": "object"
          }
        }
      },
      "ServiceList": {
        "type": "object",
        "required": [
          "count",
          "services"
        ],
        "properties": {
          "updated": {
            "type": "string",
            "format": "date"
          },
          "count": {
            "type": "integer"
          },
          "services": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Service"
            }
          }
        }
      },
      "Service": {
        "type": "object",
        "required": [
          "id",
          "name",
          "url"
        ],
        "properties": {
          "id": {
            "type": "string",
            "examples": [
              "real-time-integrations"
            ]
          },
          "name": {
            "type": "string"
          },
          "shortName": {
            "type": "string"
          },
          "tagline": {
            "type": "string"
          },
          "summary": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "problemsItSolves": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "deliverables": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "faq": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Faq"
            }
          }
        }
      },
      "CaseStudyList": {
        "type": "object",
        "required": [
          "count",
          "caseStudies"
        ],
        "properties": {
          "count": {
            "type": "integer"
          },
          "note": {
            "type": "string"
          },
          "caseStudies": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CaseStudy"
            }
          }
        }
      },
      "CaseStudy": {
        "type": "object",
        "required": [
          "id",
          "title",
          "client",
          "url"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "client": {
            "type": "string",
            "description": "Generalized descriptor — industry and scale. Never a client name.",
            "examples": [
              "Global travel-retail operator · thousands of employees, multiple countries"
            ]
          },
          "teaser": {
            "type": "string"
          },
          "serviceIds": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "challenge": {
            "type": "string"
          },
          "build": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "proves": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "format": "uri"
          }
        }
      },
      "PostList": {
        "type": "object",
        "required": [
          "count",
          "posts"
        ],
        "properties": {
          "count": {
            "type": "integer"
          },
          "posts": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Post"
            }
          }
        }
      },
      "Post": {
        "type": "object",
        "required": [
          "id",
          "title",
          "url",
          "pubDate"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "tldr": {
            "type": "string",
            "description": "40–60 word direct answer to the post’s core question"
          },
          "pubDate": {
            "type": "string",
            "format": "date"
          },
          "updatedDate": {
            "type": [
              "string",
              "null"
            ],
            "format": "date"
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "markdownUrl": {
            "type": "string",
            "format": "uri"
          },
          "faq": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Faq"
            }
          }
        }
      },
      "Faq": {
        "type": "object",
        "required": [
          "q",
          "a"
        ],
        "properties": {
          "q": {
            "type": "string"
          },
          "a": {
            "type": "string"
          }
        }
      },
      "Health": {
        "type": "object",
        "required": [
          "status"
        ],
        "properties": {
          "status": {
            "type": "string",
            "enum": [
              "ok"
            ]
          },
          "service": {
            "type": "string"
          },
          "time": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "Inquiry": {
        "type": "object",
        "required": [
          "name",
          "email",
          "message"
        ],
        "properties": {
          "name": {
            "type": "string",
            "maxLength": 120
          },
          "email": {
            "type": "string",
            "format": "email",
            "maxLength": 200
          },
          "company": {
            "type": "string",
            "maxLength": 160
          },
          "products": {
            "type": "string",
            "maxLength": 200,
            "description": "UKG products in use and rough employee count"
          },
          "message": {
            "type": "string",
            "maxLength": 5000
          },
          "website": {
            "type": "string",
            "description": "Honeypot. Leave absent. A non-empty value is silently discarded."
          }
        }
      },
      "Ok": {
        "type": "object",
        "properties": {
          "ok": {
            "type": "boolean",
            "const": true
          }
        }
      },
      "Err": {
        "type": "object",
        "properties": {
          "ok": {
            "type": "boolean",
            "const": false
          },
          "error": {
            "type": "string"
          }
        }
      }
    }
  }
}