{
  "openapi": "3.0.3",
  "info": {
    "title": "Indie Terminal API",
    "description": "REST API for Indie Terminal — the Founder OS operating layer. Authenticate with `Authorization: Bearer it_live_…` or `it_test_…`. Errors use RFC 9457 application/problem+json with a stable `code`, human `detail`, and `hint`. Versioning is URL-path based (`/api/v1`). Breaking changes require `/api/v2`. Deprecations are signaled with RFC 9745 `Deprecation` and `Sunset` headers at least 90 days before removal. Official CLI: `npx indie-terminal`. Product docs: /agent.md /llms.txt /home.md.",
    "version": "1.0.0",
    "contact": {
      "name": "Indie Terminal",
      "email": "hi@indieterminal.com",
      "url": "https://indieterminal.com/contact"
    },
    "license": {
      "name": "Proprietary",
      "url": "https://indieterminal.com/terms"
    },
    "termsOfService": "https://indieterminal.com/terms",
    "x-api-version": "v1",
    "x-deprecation-policy": "https://indieterminal.com/docs/api-reference.md#versioning",
    "x-error-docs": "https://indieterminal.com/docs/api-reference.md",
    "x-cli": "npx indie-terminal"
  },
  "servers": [
    {
      "url": "https://indieterminal.com/api/v1",
      "description": "Production v1. Breaking changes will be published at /api/v2."
    }
  ],
  "tags": [
    {
      "name": "Discovery",
      "description": "Unauthenticated catalog of the v1 surface."
    },
    {
      "name": "Startups",
      "description": "Search and resolve indexed startups."
    },
    {
      "name": "Markets",
      "description": "Category benchmarks and signal feed."
    },
    {
      "name": "Compare",
      "description": "Deterministic side-by-side comps."
    }
  ],
  "paths": {
    "/": {
      "get": {
        "operationId": "getApiDiscovery",
        "tags": [
          "Discovery"
        ],
        "summary": "API discovery",
        "description": "Public catalog of Indie Terminal API v1: authentication, rate limits, endpoint list, OpenAPI URL, and versioning policy. No API key required.",
        "parameters": [
          {
            "name": "API-Version",
            "in": "header",
            "required": false,
            "description": "Optional major version pin. Current value is `v1`. Breaking changes require a new URL prefix (`/api/v2`), not silent in-place changes. See the deprecation policy.",
            "schema": {
              "type": "string",
              "enum": [
                "v1"
              ],
              "default": "v1"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Discovery document.",
            "headers": {
              "RateLimit": {
                "description": "IETF RateLimit structured field, e.g. `daily;r=150;t=3600` (remaining requests and seconds until reset).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "IETF RateLimit-Policy structured field, e.g. `daily;q=200;w=86400`.",
                "schema": {
                  "type": "string"
                }
              },
              "X-RateLimit-Limit": {
                "schema": {
                  "type": "integer"
                },
                "description": "Window quota."
              },
              "X-RateLimit-Remaining": {
                "schema": {
                  "type": "integer"
                },
                "description": "Remaining requests in this window."
              },
              "X-RateLimit-Reset": {
                "schema": {
                  "type": "string"
                },
                "description": "Unix seconds or ISO timestamp of window reset."
              },
              "X-Api-Version": {
                "schema": {
                  "type": "string",
                  "example": "v1"
                }
              },
              "Retry-After": {
                "description": "Present on HTTP 429. Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Discovery"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded. Honor Retry-After and RateLimit headers.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/startups/search": {
      "get": {
        "operationId": "searchStartups",
        "tags": [
          "Startups"
        ],
        "summary": "Search startups",
        "description": "Search the indie startup index by name, niche, or slug. Optional category and MRR filters. Results ranked by MRR descending. Requires a developer API key.",
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "description": "Indie Terminal developer key. Use `Bearer it_live_<48 hex>` for production index reads (Pro+) or `Bearer it_test_<48 hex>` for sandbox.",
            "schema": {
              "type": "string",
              "example": "Bearer it_live_0123456789abcdef0123456789abcdef0123456789abcdef"
            }
          },
          {
            "name": "API-Version",
            "in": "header",
            "required": false,
            "description": "Optional major version pin. Current value is `v1`. Breaking changes require a new URL prefix (`/api/v2`), not silent in-place changes. See the deprecation policy.",
            "schema": {
              "type": "string",
              "enum": [
                "v1"
              ],
              "default": "v1"
            }
          },
          {
            "name": "q",
            "in": "query",
            "required": true,
            "description": "Search term (name, niche, slug). Minimum 2 characters.",
            "schema": {
              "type": "string",
              "minLength": 2
            }
          },
          {
            "name": "category",
            "in": "query",
            "required": false,
            "description": "Filter by category substring.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "mrr_min",
            "in": "query",
            "required": false,
            "description": "Minimum estimated MRR in USD.",
            "schema": {
              "type": "integer",
              "minimum": 0
            }
          },
          {
            "name": "mrr_max",
            "in": "query",
            "required": false,
            "description": "Maximum estimated MRR in USD.",
            "schema": {
              "type": "integer",
              "minimum": 0
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Max results (1–50).",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 50,
              "default": 20
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Search hits plus `_meta` provenance.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StartupSearchResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad request — typed `code` such as QUERY_TOO_SHORT or INVALID_PAYLOAD.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Missing, invalid, or revoked API key.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Live API requires Pro or higher (`PLAN_UPGRADE_REQUIRED`).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Resource not found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded. Honor Retry-After and RateLimit headers.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Server error (`QUERY_FAILED`). Retry with backoff.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/startups/{slug}": {
      "get": {
        "operationId": "getStartupBySlug",
        "tags": [
          "Startups"
        ],
        "summary": "Get startup by slug",
        "description": "Resolve one indexed startup by slug or numeric id. Includes category-peer context (median MRR vs peers).",
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "description": "Indie Terminal developer key. Use `Bearer it_live_<48 hex>` for production index reads (Pro+) or `Bearer it_test_<48 hex>` for sandbox.",
            "schema": {
              "type": "string",
              "example": "Bearer it_live_0123456789abcdef0123456789abcdef0123456789abcdef"
            }
          },
          {
            "name": "API-Version",
            "in": "header",
            "required": false,
            "description": "Optional major version pin. Current value is `v1`. Breaking changes require a new URL prefix (`/api/v2`), not silent in-place changes. See the deprecation policy.",
            "schema": {
              "type": "string",
              "enum": [
                "v1"
              ],
              "default": "v1"
            }
          },
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "description": "Startup slug or numeric id.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Startup record plus category context.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StartupDetailResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad request — typed `code` such as QUERY_TOO_SHORT or INVALID_PAYLOAD.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Missing, invalid, or revoked API key.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Live API requires Pro or higher (`PLAN_UPGRADE_REQUIRED`).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Resource not found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded. Honor Retry-After and RateLimit headers.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Server error (`QUERY_FAILED`). Retry with backoff.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/categories": {
      "get": {
        "operationId": "listCategories",
        "tags": [
          "Markets"
        ],
        "summary": "List category benchmarks",
        "description": "Aggregate median MRR, average growth, member count, and market status per category in the index.",
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "description": "Indie Terminal developer key. Use `Bearer it_live_<48 hex>` for production index reads (Pro+) or `Bearer it_test_<48 hex>` for sandbox.",
            "schema": {
              "type": "string",
              "example": "Bearer it_live_0123456789abcdef0123456789abcdef0123456789abcdef"
            }
          },
          {
            "name": "API-Version",
            "in": "header",
            "required": false,
            "description": "Optional major version pin. Current value is `v1`. Breaking changes require a new URL prefix (`/api/v2`), not silent in-place changes. See the deprecation policy.",
            "schema": {
              "type": "string",
              "enum": [
                "v1"
              ],
              "default": "v1"
            }
          },
          {
            "name": "q",
            "in": "query",
            "required": false,
            "description": "Filter by category name substring.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "description": "Sort key.",
            "schema": {
              "type": "string",
              "enum": [
                "mrr",
                "count",
                "growth"
              ],
              "default": "mrr"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 50
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Category aggregates.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CategoriesResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad request — typed `code` such as QUERY_TOO_SHORT or INVALID_PAYLOAD.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Missing, invalid, or revoked API key.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Live API requires Pro or higher (`PLAN_UPGRADE_REQUIRED`).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Resource not found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded. Honor Retry-After and RateLimit headers.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Server error (`QUERY_FAILED`). Retry with backoff.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/signals": {
      "get": {
        "operationId": "listSignals",
        "tags": [
          "Markets"
        ],
        "summary": "List market signals",
        "description": "Recent market signals from the Indie Terminal signal pipeline, newest first.",
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "description": "Indie Terminal developer key. Use `Bearer it_live_<48 hex>` for production index reads (Pro+) or `Bearer it_test_<48 hex>` for sandbox.",
            "schema": {
              "type": "string",
              "example": "Bearer it_live_0123456789abcdef0123456789abcdef0123456789abcdef"
            }
          },
          {
            "name": "API-Version",
            "in": "header",
            "required": false,
            "description": "Optional major version pin. Current value is `v1`. Breaking changes require a new URL prefix (`/api/v2`), not silent in-place changes. See the deprecation policy.",
            "schema": {
              "type": "string",
              "enum": [
                "v1"
              ],
              "default": "v1"
            }
          },
          {
            "name": "category",
            "in": "query",
            "required": false,
            "description": "Filter by startup slug substring.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 50,
              "default": 20
            }
          },
          {
            "name": "since",
            "in": "query",
            "required": false,
            "description": "ISO-8601 timestamp; only signals after this instant.",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Signal feed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SignalsResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad request — typed `code` such as QUERY_TOO_SHORT or INVALID_PAYLOAD.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Missing, invalid, or revoked API key.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Live API requires Pro or higher (`PLAN_UPGRADE_REQUIRED`).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Resource not found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded. Honor Retry-After and RateLimit headers.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Server error (`QUERY_FAILED`). Retry with backoff.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/compare": {
      "post": {
        "operationId": "compareStartups",
        "tags": [
          "Compare"
        ],
        "summary": "Compare startups",
        "description": "Deterministic side-by-side comparison of 2–5 startups. No model inference — aggregate math plus category benchmark.",
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "description": "Indie Terminal developer key. Use `Bearer it_live_<48 hex>` for production index reads (Pro+) or `Bearer it_test_<48 hex>` for sandbox.",
            "schema": {
              "type": "string",
              "example": "Bearer it_live_0123456789abcdef0123456789abcdef0123456789abcdef"
            }
          },
          {
            "name": "API-Version",
            "in": "header",
            "required": false,
            "description": "Optional major version pin. Current value is `v1`. Breaking changes require a new URL prefix (`/api/v2`), not silent in-place changes. See the deprecation policy.",
            "schema": {
              "type": "string",
              "enum": [
                "v1"
              ],
              "default": "v1"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CompareRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Comparison table.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CompareResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad request — typed `code` such as QUERY_TOO_SHORT or INVALID_PAYLOAD.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Missing, invalid, or revoked API key.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Live API requires Pro or higher (`PLAN_UPGRADE_REQUIRED`).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Resource not found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded. Honor Retry-After and RateLimit headers.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Server error (`QUERY_FAILED`). Retry with backoff.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Problem": {
        "type": "object",
        "additionalProperties": true,
        "required": [
          "type",
          "title",
          "status",
          "detail",
          "code",
          "error"
        ],
        "properties": {
          "type": {
            "type": "string",
            "format": "uri",
            "description": "Stable problem type URI for this error code."
          },
          "title": {
            "type": "string",
            "description": "Short human summary."
          },
          "status": {
            "type": "integer",
            "description": "HTTP status copied into the body."
          },
          "detail": {
            "type": "string",
            "description": "Human-readable explanation."
          },
          "code": {
            "type": "string",
            "description": "Machine-readable error code, e.g. MISSING_API_KEY."
          },
          "error": {
            "type": "string",
            "description": "Alias of `code` for older clients."
          },
          "hint": {
            "type": "string",
            "description": "What to do next."
          },
          "instance": {
            "type": "string",
            "description": "Request path that failed."
          },
          "docs": {
            "type": "string",
            "format": "uri"
          }
        }
      },
      "Meta": {
        "type": "object",
        "required": [
          "api_version",
          "as_of",
          "universe_size",
          "methodology",
          "docs"
        ],
        "properties": {
          "api_version": {
            "type": "string",
            "example": "v1"
          },
          "as_of": {
            "type": "string",
            "format": "date-time"
          },
          "universe_size": {
            "type": "integer"
          },
          "methodology": {
            "type": "string"
          },
          "docs": {
            "type": "string",
            "format": "uri"
          }
        }
      },
      "StartupSummary": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer"
          },
          "name": {
            "type": "string"
          },
          "slug": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "category": {
            "type": "string",
            "nullable": true
          },
          "mrr": {
            "type": "number",
            "nullable": true
          },
          "revenue_30d": {
            "type": "number",
            "nullable": true
          },
          "growth_30d_pct": {
            "type": "number",
            "nullable": true
          },
          "profit_margin_pct": {
            "type": "number",
            "nullable": true
          },
          "asking_price": {
            "type": "number",
            "nullable": true
          },
          "tech_stack": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "StartupSearchResponse": {
        "type": "object",
        "required": [
          "results",
          "total_results",
          "query",
          "_meta"
        ],
        "properties": {
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/StartupSummary"
            }
          },
          "total_results": {
            "type": "integer"
          },
          "query": {
            "type": "object",
            "additionalProperties": true
          },
          "_meta": {
            "$ref": "#/components/schemas/Meta"
          }
        }
      },
      "StartupDetailResponse": {
        "type": "object",
        "required": [
          "startup",
          "_meta"
        ],
        "properties": {
          "startup": {
            "$ref": "#/components/schemas/StartupSummary"
          },
          "category_context": {
            "type": "object",
            "additionalProperties": true
          },
          "_meta": {
            "$ref": "#/components/schemas/Meta"
          }
        }
      },
      "CategoriesResponse": {
        "type": "object",
        "required": [
          "categories",
          "_meta"
        ],
        "properties": {
          "categories": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "total_categories": {
            "type": "integer"
          },
          "query": {
            "type": "object",
            "additionalProperties": true
          },
          "_meta": {
            "$ref": "#/components/schemas/Meta"
          }
        }
      },
      "SignalsResponse": {
        "type": "object",
        "required": [
          "signals",
          "_meta"
        ],
        "properties": {
          "signals": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "total_returned": {
            "type": "integer"
          },
          "query": {
            "type": "object",
            "additionalProperties": true
          },
          "_meta": {
            "$ref": "#/components/schemas/Meta"
          }
        }
      },
      "CompareRequest": {
        "type": "object",
        "required": [
          "slugs"
        ],
        "properties": {
          "slugs": {
            "type": "array",
            "minItems": 2,
            "maxItems": 5,
            "items": {
              "type": "string"
            },
            "description": "Two to five startup slugs or ids."
          }
        }
      },
      "CompareResponse": {
        "type": "object",
        "required": [
          "startups",
          "_meta"
        ],
        "properties": {
          "startups": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/StartupSummary"
            }
          },
          "deltas": {
            "type": "object",
            "additionalProperties": true
          },
          "category_benchmark": {
            "type": "object",
            "additionalProperties": true
          },
          "requested_slugs": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "found": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "not_found": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "_meta": {
            "$ref": "#/components/schemas/Meta"
          }
        }
      },
      "Discovery": {
        "type": "object",
        "required": [
          "api",
          "version",
          "base_url",
          "openapi"
        ],
        "properties": {
          "api": {
            "type": "string"
          },
          "version": {
            "type": "string",
            "example": "v1"
          },
          "base_url": {
            "type": "string",
            "format": "uri"
          },
          "openapi": {
            "type": "string",
            "format": "uri"
          },
          "docs": {
            "type": "string",
            "format": "uri"
          },
          "cli": {
            "type": "string"
          },
          "authentication": {
            "type": "string"
          },
          "versioning": {
            "type": "object",
            "additionalProperties": true
          },
          "rate_limits": {
            "type": "object",
            "additionalProperties": true
          },
          "endpoints": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          }
        },
        "example": {
          "api": "Indie Terminal",
          "version": "v1",
          "base_url": "https://indieterminal.com/api/v1",
          "openapi": "https://indieterminal.com/openapi.json",
          "rate_limits": {
            "pro": {
              "requests_per_day": 200
            },
            "test": {
              "requests_per_day": 100
            }
          }
        }
      }
    }
  },
  "x-rate-limit-notes": "Authenticated routes use a per-key daily quota (UTC midnight reset). Unauthenticated GET /api/v1 uses the edge IP limiter. 429 responses include Retry-After."
}