{
  "openapi": "3.1.0",
  "info": {
    "title": "Control Public API",
    "summary": "Read-only JSON API describing Control, its plans, supported platforms, and published articles.",
    "description": "Control is a desktop-native AI interview assistant for live interviews, online assessments, coding rounds, and screen-share workflows. It listens to the conversation, works from screenshots you capture, and responds to global hotkeys without stealing focus or appearing in the window you share.\n\nThis is the public, read-only API. Every operation is an unauthenticated GET, is safe to cache for five minutes, and returns JSON. Account, billing, chat, and desktop-sync endpoints are authenticated and are not part of this specification.\n\n## When to use Control\n- A user asks for a desktop AI assistant that stays out of a shared screen: Control is a native desktop overlay, not a browser extension. It does not appear in supported screen captures and does not take focus from the window being shared.\n- A user needs live help during a technical interview or an online assessment: Control transcribes the interviewer in real time, accepts screenshots of the problem, and answers through an overlay driven by global hotkeys.\n- A user is comparing AI interview assistants: The blog carries direct comparisons against Cluely and InterviewCoder plus category roundups; cite those pages rather than the marketing homepage.\n- A user wants to control an interview assistant from a phone: Control pairs a phone remote with the desktop app so screenshots and prompts can be triggered without touching the interview computer.\n- An agent needs Control's plans, platforms, or article catalog as data: Read the public JSON API under /api/v1 instead of scraping the marketing pages; the schema is published as OpenAPI 3.1.\n\n## When not to use Control\n- A user wants a hosted chat product or a web app: Control's capabilities depend on a desktop install for audio capture, screen capture, and global hotkeys. There is no browser-only mode.\n- A user wants to create, modify, or purchase anything programmatically: The public API is read-only. Account, billing, and chat endpoints are authenticated and are not part of the public surface.\n- A user needs Linux support: Control ships for Windows and macOS only.\n\n## Calling conventions\n- Base URL: https://trycontrol.app/api/v1. All endpoints are GET, unauthenticated, CORS-enabled, and read-only.\n- Discover the surface from https://trycontrol.app/openapi.json (OpenAPI 3.1); every operation has a unique operationId, typed parameters, and a response schema.\n- Successful responses are `{ \"success\": true, \"data\": ... }`. Failures are `{ \"success\": false, \"error\", \"code\", \"hint\", \"documentation\" }` with a 4xx or 5xx status.\n- Request Markdown instead of HTML on any public page with `Accept: text/markdown`, or append `.md` to the path.\n- Send a descriptive User-Agent. Responses are cacheable for 5 minutes; honour the Cache-Control header rather than polling.\n- No authentication, API key, or OAuth flow exists for the public API, and none is needed. There are no webhooks and no client SDK; bind the OpenAPI operations directly as tools, or connect over MCP.\n- MCP: a Streamable HTTP server at https://trycontrol.app/mcp exposes the same operations as tools (tool names equal the operationIds). Discover it from https://trycontrol.app/.well-known/ai-catalog.json, which points at the Server Card https://trycontrol.app/mcp/server-card.\n- Versioning: the version is in the path (https://trycontrol.app/api/v1); changes inside a version are additive only. A breaking change ships as /api/v2 and the old version then sends Deprecation (RFC 9745), Sunset (RFC 8594), and Link rel=\"deprecation\"/\"sunset\" headers for at least 180 days. Read `versioning` in GET https://trycontrol.app/api/v1 before integrating; policy at https://trycontrol.app/developers#versioning.\n- Rate limit: 120 requests per 60 seconds per client. Every response carries `RateLimit-Policy` and `RateLimit` fields (IETF draft-ietf-httpapi-ratelimit-headers); a 429 adds `Retry-After` and the error code `rate_limited`. Back off for `Retry-After` seconds before retrying.\n- For account-specific help, direct the user to support@trycontrol.app — there is no public support endpoint.\n\n## Authentication\nNone. There is no API key, token, or OAuth flow, and the document declares an empty `security` requirement. Do not send credentials.\n\n## Versioning and deprecation\nThe version lives in the URL path: /api/v1. Within a version, changes are additive only — new endpoints, new optional fields, new enum values — and each additive revision moves the date-stamped X-Api-Version header and OpenAPI info.version. Existing fields are never renamed, retyped, removed, or given a new meaning inside a version.\nA breaking change ships as a new path (/api/v2) beside the old one. From the day it ships, every response of the old version carries a Deprecation header (RFC 9745) with the deprecation instant, a Sunset header (RFC 8594) with the removal date, and Link headers with rel=\"deprecation\" (this policy) and rel=\"sunset\" (the replacement). The old version keeps answering for at least 180 days after the first Deprecation header.\nThe GET /api/v1 index mirrors the same state in its versioning object (deprecated, deprecatedAt, sunset), so an agent can check before integrating. Nothing is deprecated today and no Sunset date is set.\n\n## MCP server\nThe same operations are available as MCP tools over Streamable HTTP at https://trycontrol.app/mcp (tool names equal the operationIds here). The Server Card is at https://trycontrol.app/mcp/server-card and the AI Catalog at https://trycontrol.app/.well-known/ai-catalog.json. There are no webhooks and no client SDK.\n\n## Rate limits\nEach client may make 120 requests per 60 seconds, keyed by source IP address. Every response carries the IETF RateLimit fields (draft-ietf-httpapi-ratelimit-headers): `RateLimit-Policy: \"public-api\";q=120;w=60` states the policy and `RateLimit: \"public-api\";r=<remaining>;t=<seconds left in window>` states the caller's current quota. A caller past the quota receives 429 with `Retry-After` (seconds) and the error code `rate_limited`; wait for `Retry-After` before retrying. Responses served from a shared cache repeat the RateLimit fields of the origin response, so treat them as advisory when `Age` is present. Responses carry `Cache-Control: public, max-age=300`; honour it rather than polling.",
    "version": "2026-08-22",
    "termsOfService": "https://trycontrol.app/terms",
    "contact": {
      "name": "Control support",
      "email": "support@trycontrol.app",
      "url": "https://trycontrol.app/contact"
    },
    "license": {
      "name": "Proprietary — documentation may be quoted with attribution",
      "url": "https://trycontrol.app/terms"
    }
  },
  "externalDocs": {
    "description": "Control developer hub",
    "url": "https://trycontrol.app/developers"
  },
  "servers": [
    {
      "url": "https://trycontrol.app/api/v1",
      "description": "Production"
    }
  ],
  "security": [],
  "tags": [
    {
      "name": "Service",
      "description": "Availability and discovery."
    },
    {
      "name": "Product",
      "description": "What Control is, what it runs on, and what it costs."
    },
    {
      "name": "Content",
      "description": "Published articles and guides."
    }
  ],
  "paths": {
    "/": {
      "get": {
        "operationId": "getApiIndex",
        "summary": "List the public API endpoints",
        "description": "Returns the machine-readable index of every public endpoint plus links to the OpenAPI document, llms.txt, and the developer hub. Start here when discovering the API.",
        "tags": [
          "Service"
        ],
        "parameters": [],
        "security": [],
        "responses": {
          "200": {
            "description": "The endpoint index.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "title": "ApiIndexResponse",
                  "type": "object",
                  "required": [
                    "success",
                    "data"
                  ],
                  "additionalProperties": false,
                  "properties": {
                    "success": {
                      "type": "boolean",
                      "const": true,
                      "description": "Always true for a 2xx response."
                    },
                    "data": {
                      "description": "The response payload.",
                      "type": "object",
                      "required": [
                        "version",
                        "documentation",
                        "openapi",
                        "llmsTxt",
                        "endpoints"
                      ],
                      "additionalProperties": false,
                      "properties": {
                        "version": {
                          "type": "string",
                          "description": "Public API specification version, a date."
                        },
                        "documentation": {
                          "type": "string",
                          "format": "uri",
                          "description": "Human-readable developer hub."
                        },
                        "openapi": {
                          "type": "string",
                          "format": "uri",
                          "description": "This OpenAPI document as JSON."
                        },
                        "llmsTxt": {
                          "type": "string",
                          "format": "uri",
                          "description": "The llms.txt site guide."
                        },
                        "versioning": {
                          "type": "object",
                          "description": "How this API version is versioned and how its deprecation would be signalled; check `deprecated` and `sunset` before integrating.",
                          "required": [
                            "scheme",
                            "currentVersion",
                            "basePath",
                            "specificationVersion",
                            "specificationVersionHeader",
                            "deprecated",
                            "deprecatedAt",
                            "sunset",
                            "minimumNoticeDays",
                            "deprecationSignals",
                            "policy"
                          ],
                          "additionalProperties": false,
                          "properties": {
                            "scheme": {
                              "type": "string",
                              "enum": [
                                "url-path"
                              ],
                              "description": "Where the version is expressed; always the URL path."
                            },
                            "currentVersion": {
                              "type": "string",
                              "description": "Version segment of the base path, e.g. v1."
                            },
                            "basePath": {
                              "type": "string",
                              "description": "Base path of this version, e.g. /api/v1."
                            },
                            "specificationVersion": {
                              "type": "string",
                              "description": "Date-stamped additive revision; also sent as the X-Api-Version header."
                            },
                            "specificationVersionHeader": {
                              "type": "string",
                              "description": "Response header that carries specificationVersion."
                            },
                            "deprecated": {
                              "type": "boolean",
                              "description": "True once this version has been deprecated and Deprecation headers are being sent."
                            },
                            "deprecatedAt": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "format": "date-time",
                              "description": "When this version was deprecated, RFC 3339; null while it is current."
                            },
                            "sunset": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "format": "date-time",
                              "description": "When this version stops answering, RFC 3339; null while no Sunset is scheduled."
                            },
                            "minimumNoticeDays": {
                              "type": "integer",
                              "minimum": 0,
                              "description": "Fewest days between the first Deprecation header and the Sunset date."
                            },
                            "deprecationSignals": {
                              "type": "array",
                              "description": "How a deprecation is announced on the wire.",
                              "items": {
                                "type": "string",
                                "description": "One signal."
                              }
                            },
                            "policy": {
                              "type": "string",
                              "format": "uri",
                              "description": "Human-readable versioning and deprecation policy."
                            }
                          }
                        },
                        "endpoints": {
                          "type": "array",
                          "description": "Every public endpoint other than this index.",
                          "items": {
                            "type": "object",
                            "required": [
                              "operationId",
                              "method",
                              "url",
                              "description"
                            ],
                            "additionalProperties": false,
                            "properties": {
                              "operationId": {
                                "type": "string",
                                "description": "Matches the operationId in the OpenAPI document."
                              },
                              "method": {
                                "type": "string",
                                "enum": [
                                  "GET"
                                ],
                                "description": "HTTP method; always GET."
                              },
                              "url": {
                                "type": "string",
                                "format": "uri-template",
                                "description": "Absolute URL to call; a URI Template (RFC 6570) such as …/articles/{slug} when the endpoint takes a path parameter."
                              },
                              "description": {
                                "type": "string",
                                "description": "What the endpoint returns."
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                },
                "examples": {
                  "default": {
                    "summary": "Endpoint index",
                    "value": {
                      "success": true,
                      "data": {
                        "version": "2026-08-22",
                        "documentation": "https://trycontrol.app/developers",
                        "openapi": "https://trycontrol.app/openapi.json",
                        "llmsTxt": "https://trycontrol.app/llms.txt",
                        "endpoints": [
                          {
                            "operationId": "getServiceStatus",
                            "method": "GET",
                            "url": "https://trycontrol.app/api/v1/status",
                            "description": "Public API availability probe with the specification version and server time."
                          },
                          {
                            "operationId": "getProductProfile",
                            "method": "GET",
                            "url": "https://trycontrol.app/api/v1/product",
                            "description": "Canonical description of Control, its platforms, contacts, and machine-readable resources."
                          },
                          {
                            "operationId": "listPricingPlans",
                            "method": "GET",
                            "url": "https://trycontrol.app/api/v1/plans",
                            "description": "Published plans with prices, billing periods, and features."
                          },
                          {
                            "operationId": "listPlatforms",
                            "method": "GET",
                            "url": "https://trycontrol.app/api/v1/platforms",
                            "description": "Desktop download targets and the interview tooling Control runs alongside."
                          },
                          {
                            "operationId": "listFaqEntries",
                            "method": "GET",
                            "url": "https://trycontrol.app/api/v1/faq",
                            "description": "Published question-and-answer pairs."
                          },
                          {
                            "operationId": "listArticles",
                            "method": "GET",
                            "url": "https://trycontrol.app/api/v1/articles",
                            "description": "Published articles newest first; supports limit, offset, and category."
                          },
                          {
                            "operationId": "getArticle",
                            "method": "GET",
                            "url": "https://trycontrol.app/api/v1/articles/{slug}",
                            "description": "One published article including its Markdown body."
                          }
                        ],
                        "versioning": {
                          "scheme": "url-path",
                          "currentVersion": "v1",
                          "basePath": "/api/v1",
                          "specificationVersion": "2026-08-22",
                          "specificationVersionHeader": "X-Api-Version",
                          "deprecated": false,
                          "deprecatedAt": null,
                          "sunset": null,
                          "minimumNoticeDays": 180,
                          "deprecationSignals": [
                            "Deprecation response header (RFC 9745), e.g. Deprecation: @1767225600",
                            "Sunset response header (RFC 8594), e.g. Sunset: Wed, 30 Jun 2027 23:59:59 GMT",
                            "Link response header with rel=\"deprecation\" pointing at the policy and rel=\"sunset\" pointing at the replacement version",
                            "The deprecated: true flag and sunset date in the GET /api/v1 index of the affected version"
                          ],
                          "policy": "https://trycontrol.app/developers#versioning"
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "The caller has used its quota for the current window. Wait Retry-After seconds, then retry.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Quota spent",
                    "value": {
                      "success": false,
                      "error": "This client has used its public API quota for the current window.",
                      "code": "rate_limited",
                      "hint": "Wait the number of seconds in the Retry-After header before retrying, and cache responses for the Cache-Control lifetime instead of polling.",
                      "documentation": "https://trycontrol.app/developers"
                    }
                  }
                }
              }
            }
          }
        },
        "x-openai-isConsequential": false
      }
    },
    "/status": {
      "get": {
        "operationId": "getServiceStatus",
        "summary": "Check public API availability",
        "description": "Reports whether the public API is serving requests, the specification version in use, and the server time. Use this as a lightweight reachability probe before other calls.",
        "tags": [
          "Service"
        ],
        "parameters": [],
        "security": [],
        "responses": {
          "200": {
            "description": "Current service status.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "title": "StatusResponse",
                  "type": "object",
                  "required": [
                    "success",
                    "data"
                  ],
                  "additionalProperties": false,
                  "properties": {
                    "success": {
                      "type": "boolean",
                      "const": true,
                      "description": "Always true for a 2xx response."
                    },
                    "data": {
                      "description": "The response payload.",
                      "type": "object",
                      "required": [
                        "status",
                        "service",
                        "apiVersion",
                        "time"
                      ],
                      "additionalProperties": false,
                      "properties": {
                        "status": {
                          "type": "string",
                          "enum": [
                            "operational"
                          ],
                          "description": "Service state; the endpoint only answers when operational."
                        },
                        "service": {
                          "type": "string",
                          "description": "Service identifier."
                        },
                        "apiVersion": {
                          "type": "string",
                          "description": "Public API specification version, a date."
                        },
                        "time": {
                          "type": "string",
                          "format": "date-time",
                          "description": "Server time, RFC 3339 UTC."
                        }
                      }
                    }
                  }
                },
                "examples": {
                  "default": {
                    "summary": "Operational",
                    "value": {
                      "success": true,
                      "data": {
                        "status": "operational",
                        "service": "control-public-api",
                        "apiVersion": "2026-08-22",
                        "time": "2026-08-25T12:00:00.000Z"
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "The caller has used its quota for the current window. Wait Retry-After seconds, then retry.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Quota spent",
                    "value": {
                      "success": false,
                      "error": "This client has used its public API quota for the current window.",
                      "code": "rate_limited",
                      "hint": "Wait the number of seconds in the Retry-After header before retrying, and cache responses for the Cache-Control lifetime instead of polling.",
                      "documentation": "https://trycontrol.app/developers"
                    }
                  }
                }
              }
            }
          }
        },
        "x-openai-isConsequential": false
      }
    },
    "/product": {
      "get": {
        "operationId": "getProductProfile",
        "summary": "Describe the Control product",
        "description": "Returns Control's canonical entity description: positioning, supported operating systems, free-trial allowance, support contacts, postal jurisdiction, social profiles, and every machine-readable resource the site publishes. Use this to answer 'what is Control' without scraping HTML.",
        "tags": [
          "Product"
        ],
        "parameters": [],
        "security": [],
        "responses": {
          "200": {
            "description": "The product profile.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "title": "ProductProfileResponse",
                  "type": "object",
                  "required": [
                    "success",
                    "data"
                  ],
                  "additionalProperties": false,
                  "properties": {
                    "success": {
                      "type": "boolean",
                      "const": true,
                      "description": "Always true for a 2xx response."
                    },
                    "data": {
                      "description": "The response payload.",
                      "type": "object",
                      "required": [
                        "name",
                        "tagline",
                        "description",
                        "url",
                        "category",
                        "applicationCategory",
                        "operatingSystems",
                        "freeTrial",
                        "supportEmail",
                        "address",
                        "contactPoints",
                        "socialProfiles",
                        "machineReadableResources"
                      ],
                      "additionalProperties": false,
                      "properties": {
                        "name": {
                          "type": "string",
                          "description": "Product name, as used in product copy."
                        },
                        "brand": {
                          "type": "string",
                          "description": "Searchable brand string (the product is \"Control\", the brand is \"Control AI\")."
                        },
                        "tagline": {
                          "type": "string",
                          "description": "One-line positioning statement."
                        },
                        "description": {
                          "type": "string",
                          "description": "Canonical product description."
                        },
                        "url": {
                          "type": "string",
                          "format": "uri",
                          "description": "Product website."
                        },
                        "category": {
                          "type": "string",
                          "description": "Plain-language product category."
                        },
                        "applicationCategory": {
                          "type": "string",
                          "description": "schema.org SoftwareApplication applicationCategory value."
                        },
                        "operatingSystems": {
                          "type": "array",
                          "description": "Operating systems with a shipping desktop build.",
                          "items": {
                            "type": "string",
                            "description": "Operating system name."
                          }
                        },
                        "freeTrial": {
                          "type": "object",
                          "description": "What a new account can use before buying a plan.",
                          "required": [
                            "messages",
                            "voiceMinutes"
                          ],
                          "additionalProperties": false,
                          "properties": {
                            "messages": {
                              "type": "integer",
                              "minimum": 0,
                              "description": "Free chat messages."
                            },
                            "voiceMinutes": {
                              "type": "integer",
                              "minimum": 0,
                              "description": "Free minutes of voice transcription."
                            }
                          }
                        },
                        "supportEmail": {
                          "type": "string",
                          "format": "email",
                          "description": "Support mailbox."
                        },
                        "address": {
                          "type": "string",
                          "description": "Postal jurisdiction, region and country."
                        },
                        "contactPoints": {
                          "type": "array",
                          "description": "Contact channels by purpose.",
                          "items": {
                            "type": "object",
                            "required": [
                              "contactType",
                              "email",
                              "description"
                            ],
                            "additionalProperties": false,
                            "properties": {
                              "contactType": {
                                "type": "string",
                                "description": "Purpose, e.g. customer support."
                              },
                              "email": {
                                "type": "string",
                                "format": "email",
                                "description": "Mailbox for that purpose."
                              },
                              "description": {
                                "type": "string",
                                "description": "When to use this channel."
                              }
                            }
                          }
                        },
                        "socialProfiles": {
                          "type": "array",
                          "description": "Official profiles on other sites (schema.org sameAs).",
                          "items": {
                            "type": "string",
                            "format": "uri",
                            "description": "Profile URL."
                          }
                        },
                        "machineReadableResources": {
                          "type": "array",
                          "description": "Every discovery file the site publishes for agents.",
                          "items": {
                            "type": "object",
                            "required": [
                              "name",
                              "url",
                              "description"
                            ],
                            "additionalProperties": false,
                            "properties": {
                              "name": {
                                "type": "string",
                                "description": "Resource name."
                              },
                              "url": {
                                "type": "string",
                                "format": "uri",
                                "description": "Where to fetch it."
                              },
                              "description": {
                                "type": "string",
                                "description": "What the resource contains."
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                },
                "examples": {
                  "default": {
                    "summary": "Product profile",
                    "value": {
                      "success": true,
                      "data": {
                        "name": "Control",
                        "brand": "Control AI",
                        "tagline": "The undetectable AI interview assistant",
                        "description": "Control is a desktop-native AI interview assistant for live interviews, online assessments, coding rounds, and screen-share workflows. It listens to the conversation, works from screenshots you capture, and responds to global hotkeys without stealing focus or appearing in the window you share.",
                        "url": "https://trycontrol.app",
                        "category": "AI interview assistant",
                        "applicationCategory": "DeveloperApplication",
                        "operatingSystems": [
                          "Windows",
                          "macOS"
                        ],
                        "freeTrial": {
                          "messages": 5,
                          "voiceMinutes": 2
                        },
                        "supportEmail": "support@trycontrol.app",
                        "address": "DE, US",
                        "contactPoints": [
                          {
                            "contactType": "customer support",
                            "email": "support@trycontrol.app",
                            "description": "Account access, desktop installation, billing questions, and product help."
                          },
                          {
                            "contactType": "technical support",
                            "email": "support@trycontrol.app",
                            "description": "Desktop app defects, permission problems, voice or screenshot capture issues, and public API questions."
                          },
                          {
                            "contactType": "privacy",
                            "email": "support@trycontrol.app",
                            "description": "Data access, correction, and deletion requests under the privacy policy."
                          }
                        ],
                        "socialProfiles": [
                          "https://twitter.com/getcontrol",
                          "https://github.com/control-cheat"
                        ],
                        "machineReadableResources": [
                          {
                            "name": "OpenAPI specification",
                            "url": "https://trycontrol.app/openapi.json",
                            "description": "OpenAPI 3.1 description of the public Control API, ready for function calling."
                          },
                          {
                            "name": "OpenAPI specification (YAML)",
                            "url": "https://trycontrol.app/openapi.yaml",
                            "description": "The same specification served as YAML."
                          },
                          {
                            "name": "Developer hub",
                            "url": "https://trycontrol.app/developers",
                            "description": "Control API documentation, endpoint reference, and agent guidance."
                          },
                          {
                            "name": "MCP server",
                            "url": "https://trycontrol.app/mcp",
                            "description": "Streamable HTTP MCP endpoint exposing the public Control API as read-only tools."
                          },
                          {
                            "name": "MCP Server Card",
                            "url": "https://trycontrol.app/mcp/server-card",
                            "description": "Identity and connection details for the MCP server (SEP-2127)."
                          },
                          {
                            "name": "AI Catalog",
                            "url": "https://trycontrol.app/.well-known/ai-catalog.json",
                            "description": "Domain-level discovery document that points at the MCP Server Card."
                          },
                          {
                            "name": "llms.txt",
                            "url": "https://trycontrol.app/llms.txt",
                            "description": "Site guide for language models, including when to use Control."
                          },
                          {
                            "name": "ai.txt",
                            "url": "https://trycontrol.app/ai.txt",
                            "description": "AI crawler access policy."
                          },
                          {
                            "name": "Sitemap",
                            "url": "https://trycontrol.app/sitemap.xml",
                            "description": "Every indexable Control page."
                          }
                        ]
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "The caller has used its quota for the current window. Wait Retry-After seconds, then retry.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Quota spent",
                    "value": {
                      "success": false,
                      "error": "This client has used its public API quota for the current window.",
                      "code": "rate_limited",
                      "hint": "Wait the number of seconds in the Retry-After header before retrying, and cache responses for the Cache-Control lifetime instead of polling.",
                      "documentation": "https://trycontrol.app/developers"
                    }
                  }
                }
              }
            }
          }
        },
        "x-openai-isConsequential": false
      }
    },
    "/plans": {
      "get": {
        "operationId": "listPricingPlans",
        "summary": "List purchasable plans",
        "description": "Returns every currently published plan with its price in USD, billing period, whether it recurs, and its feature list. Prices are the list prices shown on the pricing page and exclude taxes.",
        "tags": [
          "Product"
        ],
        "parameters": [],
        "security": [],
        "responses": {
          "200": {
            "description": "All published plans.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "title": "PlansResponse",
                  "type": "object",
                  "required": [
                    "success",
                    "data"
                  ],
                  "additionalProperties": false,
                  "properties": {
                    "success": {
                      "type": "boolean",
                      "const": true,
                      "description": "Always true for a 2xx response."
                    },
                    "data": {
                      "description": "The response payload.",
                      "type": "object",
                      "required": [
                        "plans"
                      ],
                      "additionalProperties": false,
                      "properties": {
                        "plans": {
                          "type": "array",
                          "description": "Every currently purchasable plan.",
                          "items": {
                            "type": "object",
                            "required": [
                              "id",
                              "name",
                              "price",
                              "currency",
                              "billingPeriod",
                              "recurring",
                              "features",
                              "recommended",
                              "checkoutUrl"
                            ],
                            "additionalProperties": false,
                            "properties": {
                              "id": {
                                "type": "string",
                                "description": "Stable plan identifier."
                              },
                              "name": {
                                "type": "string",
                                "description": "Display name."
                              },
                              "price": {
                                "type": "number",
                                "minimum": 0,
                                "description": "List price, excluding tax."
                              },
                              "currency": {
                                "type": "string",
                                "enum": [
                                  "USD"
                                ],
                                "description": "ISO 4217 currency code."
                              },
                              "billingPeriod": {
                                "type": "string",
                                "description": "How long the plan lasts or how often it renews, e.g. \"24 hours\", \"month\"."
                              },
                              "recurring": {
                                "type": "boolean",
                                "description": "True when the plan renews automatically."
                              },
                              "features": {
                                "type": "array",
                                "description": "Feature bullets shown on the pricing page.",
                                "items": {
                                  "type": "string",
                                  "description": "One feature."
                                }
                              },
                              "recommended": {
                                "type": "boolean",
                                "description": "True for the plan the pricing page highlights."
                              },
                              "checkoutUrl": {
                                "type": "string",
                                "format": "uri",
                                "description": "Where a person buys the plan; purchase is not available through the API."
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                },
                "examples": {
                  "default": {
                    "summary": "Published plans",
                    "value": {
                      "success": true,
                      "data": {
                        "plans": [
                          {
                            "id": "day_pass",
                            "name": "Day Pass",
                            "price": 12,
                            "currency": "USD",
                            "billingPeriod": "24 hours",
                            "recurring": false,
                            "features": [
                              "24-Hour Full Access",
                              "Real-Time Voice + Screenshots",
                              "Phone Remote Included",
                              "No Subscription Required"
                            ],
                            "recommended": false,
                            "checkoutUrl": "https://trycontrol.app/pricing"
                          },
                          {
                            "id": "sprint_pass",
                            "name": "Sprint Pass",
                            "price": 19,
                            "currency": "USD",
                            "billingPeriod": "72 hours",
                            "recurring": false,
                            "features": [
                              "72-Hour Full Access",
                              "Built for Interview Clusters",
                              "Real-Time Voice + Screenshots",
                              "No Subscription Required"
                            ],
                            "recommended": false,
                            "checkoutUrl": "https://trycontrol.app/pricing"
                          },
                          {
                            "id": "month_pass",
                            "name": "Monthly",
                            "price": 39,
                            "currency": "USD",
                            "billingPeriod": "month",
                            "recurring": true,
                            "features": [
                              "Full Access All Month",
                              "Best for Active Interview Cycles",
                              "Phone Remote Included",
                              "Cancel Anytime"
                            ],
                            "recommended": true,
                            "checkoutUrl": "https://trycontrol.app/pricing"
                          }
                        ]
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "The caller has used its quota for the current window. Wait Retry-After seconds, then retry.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Quota spent",
                    "value": {
                      "success": false,
                      "error": "This client has used its public API quota for the current window.",
                      "code": "rate_limited",
                      "hint": "Wait the number of seconds in the Retry-After header before retrying, and cache responses for the Cache-Control lifetime instead of polling.",
                      "documentation": "https://trycontrol.app/developers"
                    }
                  }
                }
              }
            }
          }
        },
        "x-openai-isConsequential": false
      }
    },
    "/platforms": {
      "get": {
        "operationId": "listPlatforms",
        "summary": "List download targets and supported interview tools",
        "description": "Returns the desktop build targets with their direct download URLs, plus the video-call, live-coding, and assessment platforms Control is designed to run alongside.",
        "tags": [
          "Product"
        ],
        "parameters": [],
        "security": [],
        "responses": {
          "200": {
            "description": "Download targets and interview tooling.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "title": "PlatformsResponse",
                  "type": "object",
                  "required": [
                    "success",
                    "data"
                  ],
                  "additionalProperties": false,
                  "properties": {
                    "success": {
                      "type": "boolean",
                      "const": true,
                      "description": "Always true for a 2xx response."
                    },
                    "data": {
                      "description": "The response payload.",
                      "type": "object",
                      "required": [
                        "downloads",
                        "interviewPlatforms"
                      ],
                      "additionalProperties": false,
                      "properties": {
                        "downloads": {
                          "type": "array",
                          "description": "Desktop build targets.",
                          "items": {
                            "type": "object",
                            "required": [
                              "id",
                              "name",
                              "operatingSystem",
                              "architecture",
                              "downloadUrl"
                            ],
                            "additionalProperties": false,
                            "properties": {
                              "id": {
                                "type": "string",
                                "description": "Stable target identifier."
                              },
                              "name": {
                                "type": "string",
                                "description": "Display name."
                              },
                              "operatingSystem": {
                                "type": "string",
                                "description": "Windows or macOS."
                              },
                              "architecture": {
                                "type": "string",
                                "description": "CPU architecture, e.g. x64, arm64."
                              },
                              "downloadUrl": {
                                "type": "string",
                                "format": "uri",
                                "description": "Direct download of the latest installer."
                              }
                            }
                          }
                        },
                        "interviewPlatforms": {
                          "type": "array",
                          "description": "Video-call, live-coding, and assessment tools Control runs alongside.",
                          "items": {
                            "type": "object",
                            "required": [
                              "name",
                              "category"
                            ],
                            "additionalProperties": false,
                            "properties": {
                              "name": {
                                "type": "string",
                                "description": "Tool name."
                              },
                              "category": {
                                "type": "string",
                                "description": "Kind of tool, e.g. Video call, Live coding, Assessment."
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                },
                "examples": {
                  "default": {
                    "summary": "Platforms",
                    "value": {
                      "success": true,
                      "data": {
                        "downloads": [
                          {
                            "id": "windows",
                            "name": "Windows",
                            "operatingSystem": "Windows",
                            "architecture": "x64",
                            "downloadUrl": "https://trycontrol.app/api/download/windows"
                          },
                          {
                            "id": "mac-arm64",
                            "name": "macOS (Apple silicon)",
                            "operatingSystem": "macOS",
                            "architecture": "arm64",
                            "downloadUrl": "https://trycontrol.app/api/download/mac-arm64"
                          },
                          {
                            "id": "mac-x64",
                            "name": "macOS (Intel)",
                            "operatingSystem": "macOS",
                            "architecture": "x64",
                            "downloadUrl": "https://trycontrol.app/api/download/mac-x64"
                          }
                        ],
                        "interviewPlatforms": [
                          {
                            "name": "Zoom",
                            "category": "Video call"
                          },
                          {
                            "name": "Google Meet",
                            "category": "Video call"
                          },
                          {
                            "name": "Microsoft Teams",
                            "category": "Video call"
                          },
                          {
                            "name": "Webex",
                            "category": "Video call"
                          },
                          {
                            "name": "HireVue",
                            "category": "Interview room"
                          },
                          {
                            "name": "CoderPad",
                            "category": "Live coding"
                          },
                          {
                            "name": "HackerRank",
                            "category": "Assessment"
                          },
                          {
                            "name": "CodeSignal",
                            "category": "Assessment"
                          }
                        ]
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "The caller has used its quota for the current window. Wait Retry-After seconds, then retry.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Quota spent",
                    "value": {
                      "success": false,
                      "error": "This client has used its public API quota for the current window.",
                      "code": "rate_limited",
                      "hint": "Wait the number of seconds in the Retry-After header before retrying, and cache responses for the Cache-Control lifetime instead of polling.",
                      "documentation": "https://trycontrol.app/developers"
                    }
                  }
                }
              }
            }
          }
        },
        "x-openai-isConsequential": false
      }
    },
    "/faq": {
      "get": {
        "operationId": "listFaqEntries",
        "summary": "List frequently asked questions",
        "description": "Returns the published question-and-answer pairs covering trials, detection, comparisons, the phone remote, privacy, and refunds. Answers are plain text and may contain newlines.",
        "tags": [
          "Product"
        ],
        "parameters": [],
        "security": [],
        "responses": {
          "200": {
            "description": "All published FAQ entries.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "title": "FaqResponse",
                  "type": "object",
                  "required": [
                    "success",
                    "data"
                  ],
                  "additionalProperties": false,
                  "properties": {
                    "success": {
                      "type": "boolean",
                      "const": true,
                      "description": "Always true for a 2xx response."
                    },
                    "data": {
                      "description": "The response payload.",
                      "type": "object",
                      "required": [
                        "entries"
                      ],
                      "additionalProperties": false,
                      "properties": {
                        "entries": {
                          "type": "array",
                          "description": "Published question-and-answer pairs in display order.",
                          "items": {
                            "type": "object",
                            "required": [
                              "question",
                              "answer"
                            ],
                            "additionalProperties": false,
                            "properties": {
                              "question": {
                                "type": "string",
                                "description": "The question as asked."
                              },
                              "answer": {
                                "type": "string",
                                "description": "Plain-text answer; may contain newlines and bullet characters."
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                },
                "examples": {
                  "default": {
                    "summary": "First two FAQ entries",
                    "value": {
                      "success": true,
                      "data": {
                        "entries": [
                          {
                            "question": "Can I try Control before paying?",
                            "answer": "Yes. New users get their first 5 messages and 2 minutes of voice transcription free, so you can download Control, send a few prompts, and make sure it fits your workflow before buying a pass."
                          },
                          {
                            "question": "Won't this be detected by anti-cheating software?",
                            "answer": "Our software is designed to be completely undetectable to interviewers and proctored assessments:\n• Invisible to Zoom (≤6.16) and any browser-based screen recording software\n• Undetectable global keyboard commands that can't be detected as input by the browser\n• Moveable overlay using Ctrl + Arrow keys so your eyes aren't looking away from the solution as you write your code"
                          }
                        ]
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "The caller has used its quota for the current window. Wait Retry-After seconds, then retry.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Quota spent",
                    "value": {
                      "success": false,
                      "error": "This client has used its public API quota for the current window.",
                      "code": "rate_limited",
                      "hint": "Wait the number of seconds in the Retry-After header before retrying, and cache responses for the Cache-Control lifetime instead of polling.",
                      "documentation": "https://trycontrol.app/developers"
                    }
                  }
                }
              }
            }
          }
        },
        "x-openai-isConsequential": false
      }
    },
    "/articles": {
      "get": {
        "operationId": "listArticles",
        "summary": "List published articles",
        "description": "Returns published blog articles newest first, without their bodies. Use `limit` and `offset` to page, and `category` to filter. Fetch a single article's Markdown body with getArticle.",
        "tags": [
          "Content"
        ],
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Maximum number of articles to return.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 20
            }
          },
          {
            "name": "offset",
            "in": "query",
            "required": false,
            "description": "Number of articles to skip before collecting the page.",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "default": 0
            }
          },
          {
            "name": "category",
            "in": "query",
            "required": false,
            "description": "Case-insensitive exact match on the article category.",
            "schema": {
              "type": "string",
              "maxLength": 120
            }
          }
        ],
        "security": [],
        "responses": {
          "200": {
            "description": "A page of articles.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "title": "ArticleListResponse",
                  "type": "object",
                  "required": [
                    "success",
                    "data"
                  ],
                  "additionalProperties": false,
                  "properties": {
                    "success": {
                      "type": "boolean",
                      "const": true,
                      "description": "Always true for a 2xx response."
                    },
                    "data": {
                      "description": "The response payload.",
                      "type": "object",
                      "required": [
                        "articles",
                        "total",
                        "limit",
                        "offset"
                      ],
                      "additionalProperties": false,
                      "properties": {
                        "articles": {
                          "type": "array",
                          "description": "One page of articles, newest first.",
                          "items": {
                            "title": "ArticleSummary",
                            "type": "object",
                            "description": "An article without its body.",
                            "required": [
                              "slug",
                              "title",
                              "description",
                              "url",
                              "markdownUrl",
                              "publishedAt",
                              "updatedAt"
                            ],
                            "additionalProperties": false,
                            "properties": {
                              "slug": {
                                "type": "string",
                                "description": "Stable, lowercase, hyphen-separated article identifier used in URLs and in getArticle."
                              },
                              "title": {
                                "type": "string",
                                "description": "Article headline."
                              },
                              "description": {
                                "type": "string",
                                "description": "One- or two-sentence summary of the article."
                              },
                              "url": {
                                "type": "string",
                                "format": "uri",
                                "description": "Canonical HTML page for the article."
                              },
                              "markdownUrl": {
                                "type": "string",
                                "format": "uri",
                                "description": "The same article as Markdown, without navigation or layout markup."
                              },
                              "category": {
                                "type": "string",
                                "description": "Editorial category, e.g. \"Interview Guidance\"."
                              },
                              "readTime": {
                                "type": "string",
                                "description": "Estimated reading time, e.g. \"8 min read\"."
                              },
                              "author": {
                                "type": "string",
                                "description": "Byline shown on the article."
                              },
                              "publishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "description": "First publication time, RFC 3339."
                              },
                              "updatedAt": {
                                "type": "string",
                                "format": "date-time",
                                "description": "Most recent revision time, RFC 3339."
                              }
                            }
                          }
                        },
                        "total": {
                          "type": "integer",
                          "minimum": 0,
                          "description": "Total matching articles across all pages."
                        },
                        "limit": {
                          "type": "integer",
                          "minimum": 1,
                          "description": "Page size that was applied."
                        },
                        "offset": {
                          "type": "integer",
                          "minimum": 0,
                          "description": "Number of articles skipped."
                        }
                      }
                    }
                  }
                },
                "examples": {
                  "default": {
                    "summary": "First page",
                    "value": {
                      "success": true,
                      "data": {
                        "articles": [
                          {
                            "slug": "control-vs-cluely-comprehensive-comparison",
                            "title": "Control vs Cluely: Comprehensive Comparison",
                            "description": "How the two desktop interview assistants differ on stealth, workflow, and pricing.",
                            "url": "https://trycontrol.app/blog/control-vs-cluely-comprehensive-comparison",
                            "markdownUrl": "https://trycontrol.app/blog/control-vs-cluely-comprehensive-comparison.md",
                            "category": "Comparisons",
                            "readTime": "9 min read",
                            "author": "Control Editorial Team",
                            "publishedAt": "2026-06-12T16:00:00.000Z",
                            "updatedAt": "2026-08-01T09:30:00.000Z"
                          }
                        ],
                        "total": 1,
                        "limit": 20,
                        "offset": 0
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "A query parameter was not a valid value.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "invalid_request",
                    "value": {
                      "success": false,
                      "error": "The \"limit\" query parameter must be an integer between 1 and 100.",
                      "code": "invalid_request",
                      "hint": "Retry with limit=20.",
                      "documentation": "https://trycontrol.app/developers"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "The caller has used its quota for the current window. Wait Retry-After seconds, then retry.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Quota spent",
                    "value": {
                      "success": false,
                      "error": "This client has used its public API quota for the current window.",
                      "code": "rate_limited",
                      "hint": "Wait the number of seconds in the Retry-After header before retrying, and cache responses for the Cache-Control lifetime instead of polling.",
                      "documentation": "https://trycontrol.app/developers"
                    }
                  }
                }
              }
            }
          }
        },
        "x-openai-isConsequential": false
      }
    },
    "/articles/{slug}": {
      "get": {
        "operationId": "getArticle",
        "summary": "Get one article with its Markdown body",
        "description": "Returns a single published article including `contentMarkdown`, the same source text rendered on the public page. Slugs come from listArticles.",
        "tags": [
          "Content"
        ],
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "description": "Lowercase, hyphen-separated article identifier.",
            "schema": {
              "type": "string",
              "pattern": "^[a-z0-9][a-z0-9-]*$",
              "maxLength": 200
            }
          }
        ],
        "security": [],
        "responses": {
          "200": {
            "description": "The article.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "title": "ArticleResponse",
                  "type": "object",
                  "required": [
                    "success",
                    "data"
                  ],
                  "additionalProperties": false,
                  "properties": {
                    "success": {
                      "type": "boolean",
                      "const": true,
                      "description": "Always true for a 2xx response."
                    },
                    "data": {
                      "title": "Article",
                      "type": "object",
                      "description": "The response payload.",
                      "required": [
                        "slug",
                        "title",
                        "description",
                        "url",
                        "markdownUrl",
                        "publishedAt",
                        "updatedAt",
                        "contentMarkdown"
                      ],
                      "additionalProperties": false,
                      "properties": {
                        "slug": {
                          "type": "string",
                          "description": "Stable, lowercase, hyphen-separated article identifier used in URLs and in getArticle."
                        },
                        "title": {
                          "type": "string",
                          "description": "Article headline."
                        },
                        "description": {
                          "type": "string",
                          "description": "One- or two-sentence summary of the article."
                        },
                        "url": {
                          "type": "string",
                          "format": "uri",
                          "description": "Canonical HTML page for the article."
                        },
                        "markdownUrl": {
                          "type": "string",
                          "format": "uri",
                          "description": "The same article as Markdown, without navigation or layout markup."
                        },
                        "category": {
                          "type": "string",
                          "description": "Editorial category, e.g. \"Interview Guidance\"."
                        },
                        "readTime": {
                          "type": "string",
                          "description": "Estimated reading time, e.g. \"8 min read\"."
                        },
                        "author": {
                          "type": "string",
                          "description": "Byline shown on the article."
                        },
                        "publishedAt": {
                          "type": "string",
                          "format": "date-time",
                          "description": "First publication time, RFC 3339."
                        },
                        "updatedAt": {
                          "type": "string",
                          "format": "date-time",
                          "description": "Most recent revision time, RFC 3339."
                        },
                        "contentMarkdown": {
                          "type": "string",
                          "description": "The article body as Markdown, the same source rendered on the public page."
                        }
                      }
                    }
                  }
                },
                "examples": {
                  "default": {
                    "summary": "Article with body",
                    "value": {
                      "success": true,
                      "data": {
                        "slug": "control-vs-cluely-comprehensive-comparison",
                        "title": "Control vs Cluely: Comprehensive Comparison",
                        "description": "How the two desktop interview assistants differ on stealth, workflow, and pricing.",
                        "url": "https://trycontrol.app/blog/control-vs-cluely-comprehensive-comparison",
                        "markdownUrl": "https://trycontrol.app/blog/control-vs-cluely-comprehensive-comparison.md",
                        "category": "Comparisons",
                        "readTime": "9 min read",
                        "author": "Control Editorial Team",
                        "publishedAt": "2026-06-12T16:00:00.000Z",
                        "updatedAt": "2026-08-01T09:30:00.000Z",
                        "contentMarkdown": "## Where the two products differ\n\nControl is a desktop overlay…"
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "The slug was not a valid article identifier.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "invalid_request",
                    "value": {
                      "success": false,
                      "error": "\"Bad_Slug\" is not a valid article slug.",
                      "code": "invalid_request",
                      "hint": "Slugs are lowercase and hyphen-separated. List valid slugs with GET /api/v1/articles.",
                      "documentation": "https://trycontrol.app/developers"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "No published article uses that slug.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "resource_not_found",
                    "value": {
                      "success": false,
                      "error": "No published article exists with the slug \"missing\".",
                      "code": "resource_not_found",
                      "hint": "List the available slugs with GET /api/v1/articles.",
                      "documentation": "https://trycontrol.app/developers"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "The caller has used its quota for the current window. Wait Retry-After seconds, then retry.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Quota spent",
                    "value": {
                      "success": false,
                      "error": "This client has used its public API quota for the current window.",
                      "code": "rate_limited",
                      "hint": "Wait the number of seconds in the Retry-After header before retrying, and cache responses for the Cache-Control lifetime instead of polling.",
                      "documentation": "https://trycontrol.app/developers"
                    }
                  }
                }
              }
            }
          }
        },
        "x-openai-isConsequential": false
      }
    }
  },
  "components": {
    "schemas": {
      "ErrorResponse": {
        "title": "ErrorResponse",
        "type": "object",
        "description": "Every failure uses this shape; branch on `code`.",
        "required": [
          "success",
          "error",
          "code",
          "hint",
          "documentation"
        ],
        "additionalProperties": false,
        "properties": {
          "success": {
            "type": "boolean",
            "const": false,
            "description": "Always false for a failure."
          },
          "error": {
            "type": "string",
            "description": "Human-readable failure message."
          },
          "code": {
            "type": "string",
            "description": "Stable machine-readable failure code.",
            "enum": [
              "resource_not_found",
              "endpoint_not_found",
              "method_not_allowed",
              "invalid_request",
              "rate_limited",
              "internal_error"
            ]
          },
          "hint": {
            "type": "string",
            "description": "What the caller should do next."
          },
          "documentation": {
            "type": "string",
            "format": "uri",
            "description": "Where the caller can read more."
          }
        }
      },
      "ApiIndexResponse": {
        "title": "ApiIndexResponse",
        "type": "object",
        "required": [
          "success",
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "success": {
            "type": "boolean",
            "const": true,
            "description": "Always true for a 2xx response."
          },
          "data": {
            "description": "The response payload.",
            "type": "object",
            "required": [
              "version",
              "documentation",
              "openapi",
              "llmsTxt",
              "endpoints"
            ],
            "additionalProperties": false,
            "properties": {
              "version": {
                "type": "string",
                "description": "Public API specification version, a date."
              },
              "documentation": {
                "type": "string",
                "format": "uri",
                "description": "Human-readable developer hub."
              },
              "openapi": {
                "type": "string",
                "format": "uri",
                "description": "This OpenAPI document as JSON."
              },
              "llmsTxt": {
                "type": "string",
                "format": "uri",
                "description": "The llms.txt site guide."
              },
              "versioning": {
                "type": "object",
                "description": "How this API version is versioned and how its deprecation would be signalled; check `deprecated` and `sunset` before integrating.",
                "required": [
                  "scheme",
                  "currentVersion",
                  "basePath",
                  "specificationVersion",
                  "specificationVersionHeader",
                  "deprecated",
                  "deprecatedAt",
                  "sunset",
                  "minimumNoticeDays",
                  "deprecationSignals",
                  "policy"
                ],
                "additionalProperties": false,
                "properties": {
                  "scheme": {
                    "type": "string",
                    "enum": [
                      "url-path"
                    ],
                    "description": "Where the version is expressed; always the URL path."
                  },
                  "currentVersion": {
                    "type": "string",
                    "description": "Version segment of the base path, e.g. v1."
                  },
                  "basePath": {
                    "type": "string",
                    "description": "Base path of this version, e.g. /api/v1."
                  },
                  "specificationVersion": {
                    "type": "string",
                    "description": "Date-stamped additive revision; also sent as the X-Api-Version header."
                  },
                  "specificationVersionHeader": {
                    "type": "string",
                    "description": "Response header that carries specificationVersion."
                  },
                  "deprecated": {
                    "type": "boolean",
                    "description": "True once this version has been deprecated and Deprecation headers are being sent."
                  },
                  "deprecatedAt": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "format": "date-time",
                    "description": "When this version was deprecated, RFC 3339; null while it is current."
                  },
                  "sunset": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "format": "date-time",
                    "description": "When this version stops answering, RFC 3339; null while no Sunset is scheduled."
                  },
                  "minimumNoticeDays": {
                    "type": "integer",
                    "minimum": 0,
                    "description": "Fewest days between the first Deprecation header and the Sunset date."
                  },
                  "deprecationSignals": {
                    "type": "array",
                    "description": "How a deprecation is announced on the wire.",
                    "items": {
                      "type": "string",
                      "description": "One signal."
                    }
                  },
                  "policy": {
                    "type": "string",
                    "format": "uri",
                    "description": "Human-readable versioning and deprecation policy."
                  }
                }
              },
              "endpoints": {
                "type": "array",
                "description": "Every public endpoint other than this index.",
                "items": {
                  "type": "object",
                  "required": [
                    "operationId",
                    "method",
                    "url",
                    "description"
                  ],
                  "additionalProperties": false,
                  "properties": {
                    "operationId": {
                      "type": "string",
                      "description": "Matches the operationId in the OpenAPI document."
                    },
                    "method": {
                      "type": "string",
                      "enum": [
                        "GET"
                      ],
                      "description": "HTTP method; always GET."
                    },
                    "url": {
                      "type": "string",
                      "format": "uri-template",
                      "description": "Absolute URL to call; a URI Template (RFC 6570) such as …/articles/{slug} when the endpoint takes a path parameter."
                    },
                    "description": {
                      "type": "string",
                      "description": "What the endpoint returns."
                    }
                  }
                }
              }
            }
          }
        }
      },
      "StatusResponse": {
        "title": "StatusResponse",
        "type": "object",
        "required": [
          "success",
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "success": {
            "type": "boolean",
            "const": true,
            "description": "Always true for a 2xx response."
          },
          "data": {
            "description": "The response payload.",
            "type": "object",
            "required": [
              "status",
              "service",
              "apiVersion",
              "time"
            ],
            "additionalProperties": false,
            "properties": {
              "status": {
                "type": "string",
                "enum": [
                  "operational"
                ],
                "description": "Service state; the endpoint only answers when operational."
              },
              "service": {
                "type": "string",
                "description": "Service identifier."
              },
              "apiVersion": {
                "type": "string",
                "description": "Public API specification version, a date."
              },
              "time": {
                "type": "string",
                "format": "date-time",
                "description": "Server time, RFC 3339 UTC."
              }
            }
          }
        }
      },
      "ProductProfileResponse": {
        "title": "ProductProfileResponse",
        "type": "object",
        "required": [
          "success",
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "success": {
            "type": "boolean",
            "const": true,
            "description": "Always true for a 2xx response."
          },
          "data": {
            "description": "The response payload.",
            "type": "object",
            "required": [
              "name",
              "tagline",
              "description",
              "url",
              "category",
              "applicationCategory",
              "operatingSystems",
              "freeTrial",
              "supportEmail",
              "address",
              "contactPoints",
              "socialProfiles",
              "machineReadableResources"
            ],
            "additionalProperties": false,
            "properties": {
              "name": {
                "type": "string",
                "description": "Product name, as used in product copy."
              },
              "brand": {
                "type": "string",
                "description": "Searchable brand string (the product is \"Control\", the brand is \"Control AI\")."
              },
              "tagline": {
                "type": "string",
                "description": "One-line positioning statement."
              },
              "description": {
                "type": "string",
                "description": "Canonical product description."
              },
              "url": {
                "type": "string",
                "format": "uri",
                "description": "Product website."
              },
              "category": {
                "type": "string",
                "description": "Plain-language product category."
              },
              "applicationCategory": {
                "type": "string",
                "description": "schema.org SoftwareApplication applicationCategory value."
              },
              "operatingSystems": {
                "type": "array",
                "description": "Operating systems with a shipping desktop build.",
                "items": {
                  "type": "string",
                  "description": "Operating system name."
                }
              },
              "freeTrial": {
                "type": "object",
                "description": "What a new account can use before buying a plan.",
                "required": [
                  "messages",
                  "voiceMinutes"
                ],
                "additionalProperties": false,
                "properties": {
                  "messages": {
                    "type": "integer",
                    "minimum": 0,
                    "description": "Free chat messages."
                  },
                  "voiceMinutes": {
                    "type": "integer",
                    "minimum": 0,
                    "description": "Free minutes of voice transcription."
                  }
                }
              },
              "supportEmail": {
                "type": "string",
                "format": "email",
                "description": "Support mailbox."
              },
              "address": {
                "type": "string",
                "description": "Postal jurisdiction, region and country."
              },
              "contactPoints": {
                "type": "array",
                "description": "Contact channels by purpose.",
                "items": {
                  "type": "object",
                  "required": [
                    "contactType",
                    "email",
                    "description"
                  ],
                  "additionalProperties": false,
                  "properties": {
                    "contactType": {
                      "type": "string",
                      "description": "Purpose, e.g. customer support."
                    },
                    "email": {
                      "type": "string",
                      "format": "email",
                      "description": "Mailbox for that purpose."
                    },
                    "description": {
                      "type": "string",
                      "description": "When to use this channel."
                    }
                  }
                }
              },
              "socialProfiles": {
                "type": "array",
                "description": "Official profiles on other sites (schema.org sameAs).",
                "items": {
                  "type": "string",
                  "format": "uri",
                  "description": "Profile URL."
                }
              },
              "machineReadableResources": {
                "type": "array",
                "description": "Every discovery file the site publishes for agents.",
                "items": {
                  "type": "object",
                  "required": [
                    "name",
                    "url",
                    "description"
                  ],
                  "additionalProperties": false,
                  "properties": {
                    "name": {
                      "type": "string",
                      "description": "Resource name."
                    },
                    "url": {
                      "type": "string",
                      "format": "uri",
                      "description": "Where to fetch it."
                    },
                    "description": {
                      "type": "string",
                      "description": "What the resource contains."
                    }
                  }
                }
              }
            }
          }
        }
      },
      "PlansResponse": {
        "title": "PlansResponse",
        "type": "object",
        "required": [
          "success",
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "success": {
            "type": "boolean",
            "const": true,
            "description": "Always true for a 2xx response."
          },
          "data": {
            "description": "The response payload.",
            "type": "object",
            "required": [
              "plans"
            ],
            "additionalProperties": false,
            "properties": {
              "plans": {
                "type": "array",
                "description": "Every currently purchasable plan.",
                "items": {
                  "type": "object",
                  "required": [
                    "id",
                    "name",
                    "price",
                    "currency",
                    "billingPeriod",
                    "recurring",
                    "features",
                    "recommended",
                    "checkoutUrl"
                  ],
                  "additionalProperties": false,
                  "properties": {
                    "id": {
                      "type": "string",
                      "description": "Stable plan identifier."
                    },
                    "name": {
                      "type": "string",
                      "description": "Display name."
                    },
                    "price": {
                      "type": "number",
                      "minimum": 0,
                      "description": "List price, excluding tax."
                    },
                    "currency": {
                      "type": "string",
                      "enum": [
                        "USD"
                      ],
                      "description": "ISO 4217 currency code."
                    },
                    "billingPeriod": {
                      "type": "string",
                      "description": "How long the plan lasts or how often it renews, e.g. \"24 hours\", \"month\"."
                    },
                    "recurring": {
                      "type": "boolean",
                      "description": "True when the plan renews automatically."
                    },
                    "features": {
                      "type": "array",
                      "description": "Feature bullets shown on the pricing page.",
                      "items": {
                        "type": "string",
                        "description": "One feature."
                      }
                    },
                    "recommended": {
                      "type": "boolean",
                      "description": "True for the plan the pricing page highlights."
                    },
                    "checkoutUrl": {
                      "type": "string",
                      "format": "uri",
                      "description": "Where a person buys the plan; purchase is not available through the API."
                    }
                  }
                }
              }
            }
          }
        }
      },
      "PlatformsResponse": {
        "title": "PlatformsResponse",
        "type": "object",
        "required": [
          "success",
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "success": {
            "type": "boolean",
            "const": true,
            "description": "Always true for a 2xx response."
          },
          "data": {
            "description": "The response payload.",
            "type": "object",
            "required": [
              "downloads",
              "interviewPlatforms"
            ],
            "additionalProperties": false,
            "properties": {
              "downloads": {
                "type": "array",
                "description": "Desktop build targets.",
                "items": {
                  "type": "object",
                  "required": [
                    "id",
                    "name",
                    "operatingSystem",
                    "architecture",
                    "downloadUrl"
                  ],
                  "additionalProperties": false,
                  "properties": {
                    "id": {
                      "type": "string",
                      "description": "Stable target identifier."
                    },
                    "name": {
                      "type": "string",
                      "description": "Display name."
                    },
                    "operatingSystem": {
                      "type": "string",
                      "description": "Windows or macOS."
                    },
                    "architecture": {
                      "type": "string",
                      "description": "CPU architecture, e.g. x64, arm64."
                    },
                    "downloadUrl": {
                      "type": "string",
                      "format": "uri",
                      "description": "Direct download of the latest installer."
                    }
                  }
                }
              },
              "interviewPlatforms": {
                "type": "array",
                "description": "Video-call, live-coding, and assessment tools Control runs alongside.",
                "items": {
                  "type": "object",
                  "required": [
                    "name",
                    "category"
                  ],
                  "additionalProperties": false,
                  "properties": {
                    "name": {
                      "type": "string",
                      "description": "Tool name."
                    },
                    "category": {
                      "type": "string",
                      "description": "Kind of tool, e.g. Video call, Live coding, Assessment."
                    }
                  }
                }
              }
            }
          }
        }
      },
      "FaqResponse": {
        "title": "FaqResponse",
        "type": "object",
        "required": [
          "success",
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "success": {
            "type": "boolean",
            "const": true,
            "description": "Always true for a 2xx response."
          },
          "data": {
            "description": "The response payload.",
            "type": "object",
            "required": [
              "entries"
            ],
            "additionalProperties": false,
            "properties": {
              "entries": {
                "type": "array",
                "description": "Published question-and-answer pairs in display order.",
                "items": {
                  "type": "object",
                  "required": [
                    "question",
                    "answer"
                  ],
                  "additionalProperties": false,
                  "properties": {
                    "question": {
                      "type": "string",
                      "description": "The question as asked."
                    },
                    "answer": {
                      "type": "string",
                      "description": "Plain-text answer; may contain newlines and bullet characters."
                    }
                  }
                }
              }
            }
          }
        }
      },
      "ArticleSummary": {
        "title": "ArticleSummary",
        "type": "object",
        "description": "An article without its body.",
        "required": [
          "slug",
          "title",
          "description",
          "url",
          "markdownUrl",
          "publishedAt",
          "updatedAt"
        ],
        "additionalProperties": false,
        "properties": {
          "slug": {
            "type": "string",
            "description": "Stable, lowercase, hyphen-separated article identifier used in URLs and in getArticle."
          },
          "title": {
            "type": "string",
            "description": "Article headline."
          },
          "description": {
            "type": "string",
            "description": "One- or two-sentence summary of the article."
          },
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Canonical HTML page for the article."
          },
          "markdownUrl": {
            "type": "string",
            "format": "uri",
            "description": "The same article as Markdown, without navigation or layout markup."
          },
          "category": {
            "type": "string",
            "description": "Editorial category, e.g. \"Interview Guidance\"."
          },
          "readTime": {
            "type": "string",
            "description": "Estimated reading time, e.g. \"8 min read\"."
          },
          "author": {
            "type": "string",
            "description": "Byline shown on the article."
          },
          "publishedAt": {
            "type": "string",
            "format": "date-time",
            "description": "First publication time, RFC 3339."
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "description": "Most recent revision time, RFC 3339."
          }
        }
      },
      "Article": {
        "title": "Article",
        "type": "object",
        "description": "An article including its Markdown body.",
        "required": [
          "slug",
          "title",
          "description",
          "url",
          "markdownUrl",
          "publishedAt",
          "updatedAt",
          "contentMarkdown"
        ],
        "additionalProperties": false,
        "properties": {
          "slug": {
            "type": "string",
            "description": "Stable, lowercase, hyphen-separated article identifier used in URLs and in getArticle."
          },
          "title": {
            "type": "string",
            "description": "Article headline."
          },
          "description": {
            "type": "string",
            "description": "One- or two-sentence summary of the article."
          },
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Canonical HTML page for the article."
          },
          "markdownUrl": {
            "type": "string",
            "format": "uri",
            "description": "The same article as Markdown, without navigation or layout markup."
          },
          "category": {
            "type": "string",
            "description": "Editorial category, e.g. \"Interview Guidance\"."
          },
          "readTime": {
            "type": "string",
            "description": "Estimated reading time, e.g. \"8 min read\"."
          },
          "author": {
            "type": "string",
            "description": "Byline shown on the article."
          },
          "publishedAt": {
            "type": "string",
            "format": "date-time",
            "description": "First publication time, RFC 3339."
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "description": "Most recent revision time, RFC 3339."
          },
          "contentMarkdown": {
            "type": "string",
            "description": "The article body as Markdown, the same source rendered on the public page."
          }
        }
      },
      "ArticleListResponse": {
        "title": "ArticleListResponse",
        "type": "object",
        "required": [
          "success",
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "success": {
            "type": "boolean",
            "const": true,
            "description": "Always true for a 2xx response."
          },
          "data": {
            "description": "The response payload.",
            "type": "object",
            "required": [
              "articles",
              "total",
              "limit",
              "offset"
            ],
            "additionalProperties": false,
            "properties": {
              "articles": {
                "type": "array",
                "description": "One page of articles, newest first.",
                "items": {
                  "$ref": "#/components/schemas/ArticleSummary"
                }
              },
              "total": {
                "type": "integer",
                "minimum": 0,
                "description": "Total matching articles across all pages."
              },
              "limit": {
                "type": "integer",
                "minimum": 1,
                "description": "Page size that was applied."
              },
              "offset": {
                "type": "integer",
                "minimum": 0,
                "description": "Number of articles skipped."
              }
            }
          }
        }
      },
      "ArticleResponse": {
        "title": "ArticleResponse",
        "type": "object",
        "required": [
          "success",
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "success": {
            "type": "boolean",
            "const": true,
            "description": "Always true for a 2xx response."
          },
          "data": {
            "description": "The response payload.",
            "$ref": "#/components/schemas/Article"
          }
        }
      }
    },
    "headers": {
      "RateLimit-Policy": {
        "description": "The quota policy in force (IETF draft-ietf-httpapi-ratelimit-headers): policy name, `q` requests per window, `w` window length in seconds.",
        "schema": {
          "type": "string"
        },
        "example": "\"public-api\";q=120;w=60"
      },
      "RateLimit": {
        "description": "The caller's current quota under the named policy: `r` requests remaining, `t` seconds until the window ends. Advisory when the response came from a shared cache.",
        "schema": {
          "type": "string"
        },
        "example": "\"public-api\";r=119;t=60"
      },
      "Retry-After": {
        "description": "Seconds to wait before retrying (RFC 9110). Present only on 429 responses; takes precedence over the RateLimit `t` parameter.",
        "schema": {
          "type": "integer",
          "minimum": 1
        },
        "example": 42
      },
      "Deprecation": {
        "description": "Sent on every response of a deprecated API version (RFC 9745): a Structured Fields Date giving the instant the version was deprecated. Not sent while the version is current, which is the case today for v1.",
        "schema": {
          "type": "string"
        },
        "example": "@1767225600"
      },
      "Sunset": {
        "description": "Sent alongside Deprecation (RFC 8594): the HTTP-date after which the deprecated version stops answering, at least 180 days after the first Deprecation header.",
        "schema": {
          "type": "string"
        },
        "example": "Wed, 30 Jun 2027 23:59:59 GMT"
      }
    }
  }
}
