{
  "openapi": "3.1.0",
  "info": {
    "title": "VC Deal Flow Signal API",
    "version": "1.3.0",
    "description": "Unified OpenAPI 3.1 + MCP descriptor for startup engineering-acceleration data. Documents the public REST surface (signals, answers, citations, badges, deep signals, scout receipts, prediction markets) AND the MCP server tools, resources, prompts. Operations that have an MCP analog carry an `x-mcp-tool` vendor extension; the full MCP server is enumerated under the top-level `x-mcp-server` block. Default rate limits are declared at the `info.x-rate-limit` level; operations that override the default carry their own `x-rate-limit` block. CC BY 4.0 attribution. No auth required for free endpoints; the paid Deep Signal endpoint uses a per-request credit-pack key delivered after Stripe checkout, OR x402 USDC pay-per-call on Base.",
    "contact": {
      "email": "signal@gitdealflow.com"
    },
    "license": {
      "name": "Free with attribution (CC BY 4.0)",
      "url": "https://creativecommons.org/licenses/by/4.0/"
    },
    "x-citation": "VC Deal Flow Signal (signals.gitdealflow.com), Q2 2026 data. SSRN: 6606558.",
    "x-revision-date": "2026-05-08",
    "x-mcp-tool-count": 8,
    "x-rest-operation-count": 25,
    "x-rate-limit": {
      "default": {
        "requestsPerMinute": 60,
        "scope": "ip",
        "burst": 120,
        "onExceeded": {
          "status": 429,
          "header": "Retry-After"
        },
        "notes": "Per-IP default for free, read-only routes. Static .json/.jsonl/.txt surfaces are edge-cached and effectively unlimited. Operations that override the default carry their own `x-rate-limit` extension. Paid /api/agent/deep-signal* routes are scoped to credit-pack key, not IP."
      },
      "retryAfter": {
        "mechanism": "header",
        "header": "Retry-After",
        "unit": "seconds"
      },
      "documentation": "https://signals.gitdealflow.com/api/v1/changelog.json"
    }
  },
  "servers": [
    {
      "url": "https://signals.gitdealflow.com"
    }
  ],
  "tags": [
    {
      "name": "signals",
      "description": "Startup engineering acceleration data"
    },
    {
      "name": "agents",
      "description": "Agent / MCP discovery surfaces"
    },
    {
      "name": "answer",
      "description": "Citation-ready Q&A retrieval"
    },
    {
      "name": "search",
      "description": "On-site search across all content"
    },
    {
      "name": "scout",
      "description": "Scout score receipts and prediction"
    },
    {
      "name": "markets",
      "description": "Open prediction markets"
    },
    {
      "name": "citation",
      "description": "Reference-manager exports"
    },
    {
      "name": "badges",
      "description": "SVG badges for embeds"
    },
    {
      "name": "deep-signal",
      "description": "Paid per-request enriched signals"
    },
    {
      "name": "meta",
      "description": "Pricing, changelog, dataset"
    },
    {
      "name": "v1",
      "description": "Versioned, machine-readable mirrors of agent surfaces (stable URL contract)"
    },
    {
      "name": "methodology",
      "description": "Reproducible signal-computation methodology"
    },
    {
      "name": "glossary",
      "description": "Controlled-vocabulary term definitions"
    }
  ],
  "paths": {
    "/api/signals.json": {
      "get": {
        "tags": [
          "signals"
        ],
        "operationId": "getSignals",
        "summary": "Full snapshot of startup engineering signals (free)",
        "description": "Returns the current period's data: meta, top-20 trending, and per-sector rankings with commit velocity, contributor growth, and signal classification.",
        "x-mcp-tool": {
          "name": "get_signals_summary",
          "description": "MCP analog projects this response to the meta + format-URL summary; full data is reachable as the `signal://summary` MCP resource and the `signal://trending` MCP resource.",
          "relation": "superset",
          "annotations": {
            "readOnlyHint": true,
            "idempotentHint": true,
            "openWorldHint": false
          }
        },
        "responses": {
          "200": {
            "description": "Successful response with all signal data",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SignalsResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/signals.csv": {
      "get": {
        "tags": [
          "signals"
        ],
        "operationId": "getSignalsCSV",
        "summary": "Same data as signals.json in CSV form",
        "responses": {
          "200": {
            "description": "CSV file with all startup signals",
            "content": {
              "text/csv": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/api/signal": {
      "get": {
        "tags": [
          "signals"
        ],
        "operationId": "getSingleSignal",
        "summary": "Single startup signal by company name",
        "x-mcp-tool": {
          "name": "get_startup_signal",
          "description": "1:1 MCP analog. The `name` MCP arg maps to the `company` query parameter. Reachable via the `signal://startup/{name}` MCP resource template.",
          "relation": "exact",
          "argumentMapping": {
            "name": "company"
          },
          "annotations": {
            "readOnlyHint": true,
            "idempotentHint": true,
            "openWorldHint": false
          }
        },
        "parameters": [
          {
            "name": "company",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 80
            },
            "description": "Display name or GitHub org slug. Case-insensitive fuzzy match."
          }
        ],
        "x-rate-limit": {
          "requestsPerMinute": 30,
          "scope": "ip",
          "burst": 60,
          "onExceeded": {
            "status": 429,
            "header": "Retry-After"
          }
        },
        "responses": {
          "200": {
            "description": "Best-match startup or { found: false }.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Startup"
                }
              }
            }
          },
          "400": {
            "description": "Missing company parameter."
          },
          "429": {
            "description": "Rate limited (30/min/IP). Retry after the `Retry-After` header."
          }
        }
      }
    },
    "/api/answer": {
      "get": {
        "tags": [
          "answer"
        ],
        "operationId": "getAnswer",
        "summary": "Single best answer to a question (citation-ready)",
        "description": "Single-shot retrieval over the agent-query corpus + standalone FAQs. Returns the best match with confidence, supporting facts, and a canonical URL for verification. Designed for ChatGPT custom GPTs, Claude tool use, Perplexity actions.",
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "maxLength": 280
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Top answer hit",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AnswerHit"
                }
              }
            }
          }
        }
      }
    },
    "/api/ask": {
      "get": {
        "tags": [
          "answer"
        ],
        "operationId": "askQuestion",
        "summary": "Top-N ranked candidates for a question",
        "description": "Sibling of /api/answer. Returns ranked candidates instead of a single best match, for autocomplete UX or comparison.",
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "maxLength": 280
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 20,
              "default": 5
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Ranked candidates",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "query": {
                      "type": "string"
                    },
                    "hits": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/AnswerHit"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/llms-search": {
      "get": {
        "tags": [
          "search"
        ],
        "operationId": "llmsSearch",
        "summary": "Site-wide semantic-ish search across all content",
        "description": "Token-overlap search across startups, sectors, blog posts, comparisons, agent queries, FAQs, and research findings. Returns ranked URLs with snippets for LLM retrieval.",
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "maxLength": 280
            }
          },
          {
            "name": "type",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "startup",
                "sector",
                "blog",
                "comparison",
                "answer",
                "faq",
                "research"
              ]
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 50,
              "default": 10
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Ranked search hits",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "query": {
                      "type": "string"
                    },
                    "total": {
                      "type": "integer"
                    },
                    "hits": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/SearchHit"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/agents.json": {
      "get": {
        "tags": [
          "agents"
        ],
        "operationId": "getAgentsCatalog",
        "summary": "MCP / A2A skill catalog",
        "description": "Mirror of /.well-known/agent-card.json — full skill list with examples and tags.",
        "responses": {
          "200": {
            "description": "Agent skill catalog",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          }
        }
      }
    },
    "/api/agent/tools": {
      "get": {
        "tags": [
          "agents"
        ],
        "operationId": "getAgentTools",
        "summary": "JSON-Schema tool definitions for direct LLM tool-use",
        "description": "Tool definitions in OpenAI / Anthropic tool-use format — drop into your agent runtime as-is.",
        "responses": {
          "200": {
            "description": "Array of tool definitions",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          }
        }
      }
    },
    "/api/answers.json": {
      "get": {
        "tags": [
          "answer"
        ],
        "operationId": "getAnswersCorpus",
        "summary": "Full Q&A corpus (agent-queries + FAQs)",
        "description": "Bulk dump of every agent query and standalone FAQ for offline embedding / fine-tuning.",
        "responses": {
          "200": {
            "description": "Q&A corpus",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          }
        }
      }
    },
    "/api/changelog.json": {
      "get": {
        "tags": [
          "meta"
        ],
        "operationId": "getChangelog",
        "summary": "Machine-readable changelog",
        "responses": {
          "200": {
            "description": "Changelog entries",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          }
        }
      }
    },
    "/api/dataset.jsonl": {
      "get": {
        "tags": [
          "signals"
        ],
        "operationId": "getDatasetJsonl",
        "summary": "Full per-startup dataset (NDJSON)",
        "description": "Newline-delimited JSON dump suitable for streaming into pandas, DuckDB, or a training pipeline. CC BY 4.0.",
        "responses": {
          "200": {
            "description": "JSONL stream",
            "content": {
              "application/x-ndjson": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/api/receipts/{username}": {
      "get": {
        "tags": [
          "scout"
        ],
        "operationId": "getScoutReceipts",
        "summary": "Scout Score for a GitHub user (0-100)",
        "description": "Backwards-looking proof of taste: how many validated unicorns did this user star *before* the funding/$1B/acquisition event?",
        "x-mcp-tool": {
          "name": "get_scout_receipts",
          "description": "1:1 MCP analog. The `github_username` MCP arg maps to the `username` path parameter.",
          "relation": "exact",
          "argumentMapping": {
            "github_username": "username"
          },
          "annotations": {
            "readOnlyHint": true,
            "idempotentHint": true,
            "openWorldHint": false
          }
        },
        "parameters": [
          {
            "name": "username",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 39
            }
          }
        ],
        "x-rate-limit": {
          "requestsPerMinute": 10,
          "scope": "ip",
          "burst": 20,
          "onExceeded": {
            "status": 429,
            "header": "Retry-After"
          },
          "notes": "Tighter than the default because the scoring step calls the GitHub API and is bursty by nature."
        },
        "responses": {
          "200": {
            "description": "Scout score with personality + breakdown",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "400": {
            "description": "Invalid GitHub username."
          },
          "429": {
            "description": "Rate limited (10/min/IP). Retry after the `Retry-After` header."
          }
        }
      }
    },
    "/api/markets/{slug}": {
      "get": {
        "tags": [
          "markets"
        ],
        "operationId": "getMarket",
        "summary": "Open prediction market with candidates",
        "description": "Returns the market question, resolver, source-of-truth, and ranked candidates with current signal data.",
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Market payload",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "404": {
            "description": "Market not found — response includes the available list."
          }
        }
      }
    },
    "/api/cite/{format}/{slug}": {
      "get": {
        "tags": [
          "citation"
        ],
        "operationId": "getCitation",
        "summary": "Reference-manager export for a finding or the SSRN paper",
        "description": "Reference-manager export. Use slug=paper for the SSRN paper, slug=dataset for the dataset, or any /research/[slug] finding slug.",
        "parameters": [
          {
            "name": "format",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "enum": [
                "bibtex",
                "ris",
                "apa",
                "mla",
                "chicago",
                "wikipedia"
              ]
            }
          },
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Citation as plain text",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "description": "Unknown format or slug."
          }
        }
      }
    },
    "/api/v1/pricing.json": {
      "get": {
        "tags": [
          "meta"
        ],
        "operationId": "getPricing",
        "summary": "Versioned pricing table (machine-readable)",
        "description": "Stable v1 pricing surface for affiliates, partner directories, and AI agents. Tier slugs are stable; price values may change.",
        "responses": {
          "200": {
            "description": "Pricing tiers + currency + as-of timestamp",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          }
        }
      }
    },
    "/api/badge/scout/{username}/svg": {
      "get": {
        "tags": [
          "badges"
        ],
        "operationId": "getScoutBadge",
        "summary": "Scout-Score SVG badge for a GitHub user",
        "parameters": [
          {
            "name": "username",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "SVG badge",
            "content": {
              "image/svg+xml": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/api/badge/built-with/svg": {
      "get": {
        "tags": [
          "badges"
        ],
        "operationId": "getBuiltWithBadge",
        "summary": "\"Built with VC Deal Flow Signal\" SVG badge",
        "responses": {
          "200": {
            "description": "SVG badge",
            "content": {
              "image/svg+xml": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/api/badge/momentum/{org}/{repo}/svg": {
      "get": {
        "tags": [
          "badges"
        ],
        "operationId": "getMomentumBadge",
        "summary": "Repo momentum SVG badge",
        "parameters": [
          {
            "name": "org",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "repo",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "SVG badge",
            "content": {
              "image/svg+xml": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/api/agent/deep-signal": {
      "post": {
        "tags": [
          "deep-signal"
        ],
        "operationId": "getDeepSignal",
        "summary": "Get deep enriched signal (paid, per-request)",
        "description": "PAID per-request endpoint — €0.19/call, sold in 100-credit packs at €19. Returns enriched signal beyond /api/signal: composite score, sector percentile, plain-English thesis, comparables, multi-period history. 1 credit consumed only on a successful match; misses are FREE. Credits never expire. Buy at https://signals.gitdealflow.com/agents/credits — API key delivered by email after Stripe checkout.",
        "x-mcp-tool": {
          "name": "get_deep_signal",
          "description": "1:1 MCP analog (credit-pack-key flavour). The MCP server reuses the same handler. Pricing parity: €0.19/call. The x402 (USDC pay-per-call) flavour is documented under POST /api/agent/deep-signal/x402.",
          "relation": "exact",
          "paid": true,
          "unitPrice": "EUR 0.19",
          "annotations": {
            "readOnlyHint": false,
            "idempotentHint": true,
            "openWorldHint": false
          }
        },
        "security": [
          {
            "creditPackKey": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 100,
                    "description": "Startup display name or GitHub org slug."
                  }
                },
                "required": [
                  "name"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Deep signal payload (or { found: false } for an untracked startup, charged: 0).",
            "headers": {
              "X-Credits-Balance": {
                "description": "Remaining credit balance after this call.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DeepSignal"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "402": {
            "description": "Insufficient credits."
          }
        }
      }
    },
    "/api/agent/deep-signal/x402": {
      "post": {
        "tags": [
          "deep-signal"
        ],
        "operationId": "getDeepSignalX402",
        "summary": "Get deep enriched signal (x402 — pay-per-call USDC on Base)",
        "description": "Same payload as /api/agent/deep-signal but priced and authenticated via the x402 protocol (HTTP 402 micropayments). $0.19 USDC per successful call on Base mainnet. No signup, no API key — agents pay per request via the X-PAYMENT header (EIP-3009 transferWithAuthorization). Misses (404) are not charged. Settled by the Coinbase x402 facilitator. See https://x402.org for client implementations.",
        "x-mcp-tool": {
          "name": "get_deep_signal",
          "description": "x402 variant — same MCP tool, no API key, USDC on Base. The MCP server picks the right pricing rail based on caller context.",
          "relation": "exact",
          "paid": true,
          "unitPrice": "USDC 0.19",
          "paymentProtocol": "x402",
          "annotations": {
            "readOnlyHint": false,
            "idempotentHint": true,
            "openWorldHint": false
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 100,
                    "description": "Startup display name or GitHub org slug."
                  }
                },
                "required": [
                  "name"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Deep signal payload, settled. Response includes X-PAYMENT-RESPONSE header with transaction reference.",
            "headers": {
              "X-PAYMENT-RESPONSE": {
                "description": "Base64-encoded JSON with on-chain settlement details (txHash, network, payer).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DeepSignal"
                }
              }
            }
          },
          "402": {
            "description": "Payment Required. Response body lists supported payment requirements (network, asset, payTo, price). Agent signs an EIP-3009 authorization and retries with X-PAYMENT header."
          },
          "404": {
            "description": "Startup not in tracked universe — no settlement performed."
          },
          "503": {
            "description": "x402 endpoint not configured (X402_PAY_TO_ADDRESS env var missing)."
          }
        }
      }
    },
    "/api/account/credits": {
      "get": {
        "tags": [
          "deep-signal"
        ],
        "operationId": "getCredits",
        "summary": "Check credit balance for an API key",
        "security": [
          {
            "creditPackKey": []
          }
        ],
        "responses": {
          "200": {
            "description": "Current credit state.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "balance": {
                      "type": "integer",
                      "minimum": 0
                    },
                    "purchased": {
                      "type": "integer",
                      "minimum": 0
                    },
                    "consumed": {
                      "type": "integer",
                      "minimum": 0
                    },
                    "lastConsumedAt": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "format": "date-time"
                    },
                    "purchaseUrl": {
                      "type": "string",
                      "format": "uri"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key."
          }
        }
      }
    },
    "/api/scout/predict": {
      "get": {
        "tags": [
          "scout"
        ],
        "operationId": "getScoutPrediction",
        "summary": "Forward-looking scout prediction (experimental)",
        "description": "Predicts which currently-tracked startups a given GitHub user is most likely to bet on next, using their starring history.",
        "parameters": [
          {
            "name": "username",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Ranked predictions",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/signals.json": {
      "get": {
        "tags": [
          "v1",
          "signals"
        ],
        "operationId": "getSignalsV1",
        "summary": "Versioned alias of /api/signals.json",
        "description": "Stable v1 path for procurement automations and agents that pin to a versioned URL. Body identical to /api/signals.json. Canonical URL declared via Link rel=canonical header.",
        "responses": {
          "200": {
            "description": "Successful response with all signal data",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SignalsResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/agents.json": {
      "get": {
        "tags": [
          "v1",
          "agents"
        ],
        "operationId": "getAgentsV1",
        "summary": "Versioned alias of /api/agents.json (MCP / A2A skill catalog)",
        "responses": {
          "200": {
            "description": "Agent skill catalog",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/answers.json": {
      "get": {
        "tags": [
          "v1",
          "answer"
        ],
        "operationId": "getAnswersV1",
        "summary": "Versioned alias of /api/answers.json (full Q&A corpus)",
        "responses": {
          "200": {
            "description": "Q&A corpus",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/changelog.json": {
      "get": {
        "tags": [
          "v1",
          "meta"
        ],
        "operationId": "getChangelogV1",
        "summary": "Versioned alias of /api/changelog.json",
        "responses": {
          "200": {
            "description": "Changelog entries",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/dataset.jsonl": {
      "get": {
        "tags": [
          "v1",
          "signals"
        ],
        "operationId": "getDatasetJsonlV1",
        "summary": "Versioned alias of /api/dataset.jsonl (NDJSON dataset)",
        "responses": {
          "200": {
            "description": "NDJSON stream of every tracked startup × period.",
            "content": {
              "application/x-ndjson": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/faq.json": {
      "get": {
        "tags": [
          "v1",
          "answer"
        ],
        "operationId": "getFaqV1",
        "summary": "Standalone FAQ corpus (101 entries)",
        "description": "Curated FAQ corpus separate from the agent-query firehose. Stable answer slugs — safe to cite.",
        "responses": {
          "200": {
            "description": "FAQ entries",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/methodology.json": {
      "get": {
        "tags": [
          "v1",
          "methodology"
        ],
        "operationId": "getMethodologyV1",
        "summary": "Reproducible signal-computation methodology (HowTo)",
        "description": "Schema.org HowTo describing the 6-step signal pipeline (collect, filter, normalise, accelerate, classify, rank). Companion to the human-facing /methodology page and the SSRN write-up (DOI 10.2139/ssrn.6606558).",
        "x-mcp-tool": {
          "name": "get_methodology",
          "description": "1:1 MCP analog. The MCP tool returns the same HowTo + summary metadata.",
          "relation": "exact",
          "annotations": {
            "readOnlyHint": true,
            "idempotentHint": true,
            "openWorldHint": false
          }
        },
        "responses": {
          "200": {
            "description": "Methodology HowTo + metadata",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/glossary.json": {
      "get": {
        "tags": [
          "v1",
          "glossary"
        ],
        "operationId": "getGlossaryV1",
        "summary": "Controlled-vocabulary glossary (DefinedTermSet)",
        "description": "Schema.org DefinedTermSet of 18 controlled-vocabulary terms used across signals, sectors, and methodology.",
        "responses": {
          "200": {
            "description": "Glossary as DefinedTermSet",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/openapi.json": {
      "get": {
        "tags": [
          "v1",
          "agents"
        ],
        "operationId": "getOpenapiV1",
        "summary": "This document — versioned alias of /api/openapi.json",
        "description": "Self-referential. Some agents pin to versioned URLs for the descriptor itself.",
        "responses": {
          "200": {
            "description": "OpenAPI 3.1 spec (this document)",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "SignalsResponse": {
        "type": "object",
        "properties": {
          "meta": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string"
              },
              "period": {
                "type": "object",
                "properties": {
                  "slug": {
                    "type": "string"
                  },
                  "name": {
                    "type": "string"
                  }
                }
              },
              "totalSectors": {
                "type": "integer"
              },
              "totalStartups": {
                "type": "integer"
              },
              "lastUpdated": {
                "type": "string",
                "format": "date-time"
              },
              "citation": {
                "type": "string"
              }
            }
          },
          "trending": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Startup"
            }
          },
          "sectors": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Sector"
            }
          }
        }
      },
      "Startup": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "stage": {
            "type": "string",
            "enum": [
              "Pre-seed",
              "Seed",
              "Series A/B",
              "Growth"
            ]
          },
          "geography": {
            "type": "string"
          },
          "commitVelocity14d": {
            "type": "integer",
            "description": "Total commits over a rolling 14-day window"
          },
          "commitVelocityChange": {
            "type": "string",
            "description": "Percentage change vs. prior 14-day window (e.g., '+120%')"
          },
          "contributors": {
            "type": "integer"
          },
          "contributorGrowth": {
            "type": "string"
          },
          "newRepos": {
            "type": "integer"
          },
          "signalType": {
            "type": "string",
            "enum": [
              "Engineering hiring burst",
              "Infrastructure buildout",
              "Deploy frequency spike",
              "Framework migration"
            ]
          },
          "githubUrl": {
            "type": "string",
            "format": "uri"
          },
          "websiteUrl": {
            "type": "string",
            "format": "uri"
          },
          "linkedinUrl": {
            "type": "string",
            "format": "uri"
          }
        }
      },
      "Sector": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "slug": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "startupCount": {
            "type": "integer"
          },
          "startups": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Startup"
            }
          }
        }
      },
      "AnswerHit": {
        "type": "object",
        "properties": {
          "question": {
            "type": "string"
          },
          "answer": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "source": {
            "type": "string",
            "enum": [
              "agent-query",
              "faq"
            ]
          },
          "confidence": {
            "type": "number",
            "minimum": 0,
            "maximum": 1
          },
          "facts": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "claim": {
                  "type": "string"
                },
                "sourceUrl": {
                  "type": "string",
                  "format": "uri"
                }
              }
            }
          },
          "related": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "question": {
                  "type": "string"
                },
                "url": {
                  "type": "string",
                  "format": "uri"
                }
              }
            }
          }
        }
      },
      "SearchHit": {
        "type": "object",
        "properties": {
          "url": {
            "type": "string",
            "format": "uri"
          },
          "title": {
            "type": "string"
          },
          "snippet": {
            "type": "string"
          },
          "type": {
            "type": "string",
            "enum": [
              "startup",
              "sector",
              "blog",
              "comparison",
              "answer",
              "faq",
              "research"
            ]
          },
          "score": {
            "type": "number"
          }
        }
      },
      "DeepSignal": {
        "type": "object",
        "properties": {
          "found": {
            "type": "boolean"
          },
          "name": {
            "type": "string"
          },
          "sector": {
            "type": "string"
          },
          "stage": {
            "type": "string"
          },
          "geography": {
            "type": "string"
          },
          "signalType": {
            "type": "string"
          },
          "scores": {
            "type": "object",
            "properties": {
              "velocity": {
                "type": "integer",
                "minimum": 0,
                "maximum": 100
              },
              "growth": {
                "type": "integer",
                "minimum": 0,
                "maximum": 100
              },
              "novelty": {
                "type": "integer",
                "minimum": 0,
                "maximum": 100
              },
              "composite": {
                "type": "integer",
                "minimum": 0,
                "maximum": 100
              }
            }
          },
          "rank": {
            "type": "object",
            "properties": {
              "inSector": {
                "type": "integer"
              },
              "sectorTotal": {
                "type": "integer"
              },
              "sectorPercentile": {
                "type": "integer",
                "minimum": 0,
                "maximum": 100
              }
            }
          },
          "thesis": {
            "type": "string"
          },
          "comparables": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string"
                },
                "commitVelocityChange": {
                  "type": "string"
                },
                "signalType": {
                  "type": "string"
                }
              }
            }
          },
          "balance": {
            "type": "integer",
            "minimum": 0
          },
          "charged": {
            "type": "integer",
            "minimum": 0,
            "maximum": 1
          },
          "citation": {
            "type": "string"
          }
        },
        "required": [
          "found"
        ]
      }
    },
    "securitySchemes": {
      "creditPackKey": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "gdf_v2.<customerId>.<hmac>",
        "description": "Per-request credit-pack API key delivered by email after Stripe checkout. Format: `gdf_v2.<stripe_customer_id>.<hmac16>`. Buy at https://signals.gitdealflow.com/agents/credits."
      }
    }
  },
  "x-mcp": {
    "rpcEndpoint": "https://signals.gitdealflow.com/api/mcp/rpc",
    "manifestUrl": "https://signals.gitdealflow.com/.well-known/mcp.json",
    "skillsManifest": "https://signals.gitdealflow.com/.well-known/skills.json",
    "protocolVersion": "2025-06-18"
  },
  "x-mcp-server": {
    "protocolVersion": "2025-06-18",
    "server": {
      "name": "vc-deal-flow-signal",
      "title": "VC Deal Flow Signal",
      "version": "1.2.0",
      "instructions": "Read-only signal data on startup engineering acceleration. All data CC BY 4.0 — cite signals.gitdealflow.com when used in derivative work."
    },
    "transports": [
      {
        "type": "streamable-http",
        "url": "https://signals.gitdealflow.com/api/mcp/rpc",
        "authentication": "none-for-free-tools; bearer gdf_v2 for get_deep_signal"
      },
      {
        "type": "stdio",
        "npm": "@gitdealflow/mcp-signal",
        "command": "npx -y @gitdealflow/mcp-signal"
      }
    ],
    "directories": [
      {
        "name": "Smithery",
        "url": "https://smithery.ai/servers/kindrat86/mcp-deal-flow-signal"
      },
      {
        "name": "Glama",
        "url": "https://glama.ai/mcp/servers/kindrat86/mcp-deal-flow-signal"
      }
    ],
    "skillsManifest": "https://signals.gitdealflow.com/.well-known/skills.json",
    "tools": [
      {
        "name": "get_trending_startups",
        "description": "Top 20 startups across all sectors for the current weekly period.",
        "httpAnalog": {
          "method": "GET",
          "path": "/api/signals.json",
          "projection": "trending[]"
        },
        "inputSchema": {
          "type": "object",
          "properties": {},
          "additionalProperties": false
        },
        "annotations": {
          "readOnlyHint": true,
          "idempotentHint": true,
          "openWorldHint": false
        }
      },
      {
        "name": "search_startups_by_sector",
        "description": "Startups within a single sector ranked by engineering acceleration.",
        "httpAnalog": {
          "method": "GET",
          "path": "/api/signals.json",
          "projection": "sectors[?slug==input.sector_slug]"
        },
        "inputSchema": {
          "type": "object",
          "properties": {
            "sector_slug": {
              "type": "string",
              "description": "Sector slug (e.g. 'devtools', 'ai-infrastructure')."
            }
          },
          "required": [
            "sector_slug"
          ],
          "additionalProperties": false
        },
        "annotations": {
          "readOnlyHint": true,
          "idempotentHint": true,
          "openWorldHint": false
        }
      },
      {
        "name": "get_startup_signal",
        "description": "Full profile for a single tracked startup by display name or GitHub org slug.",
        "httpAnalog": {
          "method": "GET",
          "path": "/api/signal",
          "argumentMapping": {
            "name": "company"
          }
        },
        "inputSchema": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string",
              "description": "Startup display name or GitHub org slug."
            }
          },
          "required": [
            "name"
          ],
          "additionalProperties": false
        },
        "annotations": {
          "readOnlyHint": true,
          "idempotentHint": true,
          "openWorldHint": false
        }
      },
      {
        "name": "get_signals_summary",
        "description": "Period, sector and startup counts, last refresh, format URLs.",
        "httpAnalog": {
          "method": "GET",
          "path": "/api/signals.json",
          "projection": "meta + format URLs"
        },
        "inputSchema": {
          "type": "object",
          "properties": {},
          "additionalProperties": false
        },
        "annotations": {
          "readOnlyHint": true,
          "idempotentHint": true,
          "openWorldHint": false
        }
      },
      {
        "name": "get_scout_receipts",
        "description": "Scout Score (0-100) for a GitHub user — backwards-looking proof of taste.",
        "httpAnalog": {
          "method": "GET",
          "path": "/api/receipts/{username}",
          "argumentMapping": {
            "github_username": "username"
          }
        },
        "inputSchema": {
          "type": "object",
          "properties": {
            "github_username": {
              "type": "string",
              "pattern": "^[a-zA-Z0-9](?:[a-zA-Z0-9]|-(?=[a-zA-Z0-9])){0,38}$",
              "description": "GitHub username, 1-39 chars, alphanumeric + single hyphens."
            }
          },
          "required": [
            "github_username"
          ],
          "additionalProperties": false
        },
        "annotations": {
          "readOnlyHint": true,
          "idempotentHint": true,
          "openWorldHint": false
        }
      },
      {
        "name": "get_methodology",
        "description": "Full reproducible signal-computation methodology (HowTo).",
        "httpAnalog": {
          "method": "GET",
          "path": "/api/v1/methodology.json"
        },
        "inputSchema": {
          "type": "object",
          "properties": {},
          "additionalProperties": false
        },
        "annotations": {
          "readOnlyHint": true,
          "idempotentHint": true,
          "openWorldHint": false
        }
      },
      {
        "name": "get_deep_signal",
        "description": "PAID — €0.19/call (or USDC 0.19 via x402). Returns enriched signal: composite score, sector percentile, plain-English thesis, comparables, multi-period history.",
        "httpAnalog": [
          {
            "method": "POST",
            "path": "/api/agent/deep-signal",
            "auth": "creditPackKey",
            "paid": true,
            "unitPrice": "EUR 0.19"
          },
          {
            "method": "POST",
            "path": "/api/agent/deep-signal/x402",
            "auth": "x402",
            "paid": true,
            "unitPrice": "USDC 0.19"
          }
        ],
        "inputSchema": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string",
              "description": "Startup display name or GitHub org slug."
            }
          },
          "required": [
            "name"
          ],
          "additionalProperties": false
        },
        "annotations": {
          "readOnlyHint": false,
          "idempotentHint": true,
          "openWorldHint": false
        },
        "paid": true
      },
      {
        "name": "share_result",
        "description": "Compose a sharable post for X / Bluesky / Mastodon / LinkedIn / Telegram from a signal takeaway.",
        "httpAnalog": null,
        "requiresUserApproval": true,
        "inputSchema": {
          "type": "object",
          "properties": {
            "text": {
              "type": "string",
              "minLength": 10,
              "maxLength": 200
            },
            "network": {
              "type": "string",
              "enum": [
                "all",
                "twitter",
                "bluesky",
                "mastodon",
                "linkedin",
                "telegram"
              ],
              "default": "all"
            },
            "includeAttribution": {
              "type": "boolean",
              "default": true
            }
          },
          "required": [
            "text"
          ],
          "additionalProperties": false
        },
        "annotations": {
          "readOnlyHint": true,
          "idempotentHint": true,
          "openWorldHint": false
        }
      }
    ],
    "resources": [
      {
        "uri": "signal://trending",
        "name": "Trending Startups (current week)",
        "description": "Top 20 startups across all sectors for the current weekly period.",
        "mimeType": "application/json",
        "httpAnalog": "GET /api/signals.json"
      },
      {
        "uri": "signal://summary",
        "name": "Dataset Summary",
        "description": "Period, sector and startup counts, last refresh, format URLs.",
        "mimeType": "application/json",
        "httpAnalog": "GET /api/v1/signals.json (meta sub-object)"
      },
      {
        "uri": "signal://methodology",
        "name": "Signal Methodology",
        "description": "Full methodology document.",
        "mimeType": "text/markdown",
        "httpAnalog": "GET /api/v1/methodology.json"
      }
    ],
    "resourceTemplates": [
      {
        "uriTemplate": "signal://startup/{name}",
        "name": "Startup Signal Profile",
        "description": "Full profile for a single tracked startup.",
        "mimeType": "application/json",
        "httpAnalog": "GET /api/signal?company={name}"
      },
      {
        "uriTemplate": "signal://sector/{slug}",
        "name": "Sector Signal Snapshot",
        "description": "All tracked startups within a sector.",
        "mimeType": "application/json",
        "httpAnalog": "GET /api/signals.json (sectors[slug])"
      }
    ],
    "prompts": [
      {
        "name": "weekly_digest",
        "description": "Monday-morning Signal Digest from the current top-20 trending startups.",
        "arguments": []
      },
      {
        "name": "sector_deep_dive",
        "description": "Sector intelligence brief — top movers, dark horses, thesis follow-ups.",
        "arguments": [
          {
            "name": "sector",
            "description": "Sector slug.",
            "required": true
          }
        ]
      },
      {
        "name": "find_dark_horse",
        "description": "Surface one under-the-radar startup with sustained acceleration.",
        "arguments": [
          {
            "name": "sector",
            "description": "Optional sector slug.",
            "required": false
          }
        ]
      },
      {
        "name": "compare_startups",
        "description": "Head-to-head investor comparison of two named startups.",
        "arguments": [
          {
            "name": "name_a",
            "description": "First startup.",
            "required": true
          },
          {
            "name": "name_b",
            "description": "Second startup.",
            "required": true
          }
        ]
      },
      {
        "name": "acceleration_memo",
        "description": "One-page deal memo grounded in the live signal profile of a named startup.",
        "arguments": [
          {
            "name": "name",
            "description": "Startup display name or GitHub org slug.",
            "required": true
          }
        ]
      }
    ]
  },
  "x-a2a": {
    "agentCardUrl": "https://signals.gitdealflow.com/.well-known/agent-card.json",
    "jsonrpcEndpoint": "https://signals.gitdealflow.com/api/a2a",
    "protocolVersion": "0.3.0"
  },
  "x-changelog": [
    {
      "version": "1.3.0",
      "date": "2026-05-08",
      "changes": [
        "Added `info.x-rate-limit` default (60/min/IP, burst 120) so paid agents discover throttling without hitting 429.",
        "Added per-operation `x-rate-limit` overrides on /api/signal (30/min/IP) and /api/receipts/{username} (10/min/IP).",
        "Added `x-mcp.skillsManifest` and `x-mcp-server.skillsManifest` pointing to /.well-known/skills.json — Anthropic-style skills card enumerating the 5 MCP prompts as agent-callable skills with explicit invoke contracts.",
        "Added 11 extension-stripped /api/v1/<resource> aliases (signals, faq, methodology, glossary, answers, openapi, agents, changelog, dataset, pricing, uptime) for agents that strip file extensions; canonical URLs remain at .json/.jsonl variants."
      ]
    },
    {
      "version": "1.2.0",
      "date": "2026-05-07",
      "changes": [
        "Added x-mcp-tool extensions to 6 operations with MCP analogs (get_signals_summary, get_startup_signal, get_scout_receipts, get_methodology, get_deep_signal x2 variants).",
        "Added top-level x-mcp-server with full tool/resource/prompt enumeration including HTTP analog mapping.",
        "Documented 9 /api/v1/* versioned endpoints (signals, agents, answers, changelog, dataset, faq, methodology, glossary, openapi)."
      ]
    },
    {
      "version": "1.1.0",
      "date": "2026-04-22",
      "changes": [
        "Initial public spec."
      ]
    }
  ]
}