{
  "openapi": "3.1.0",
  "info": {
    "title": "StartupHub.ai API",
    "version": "1.0.0",
    "description": "Tools and agentic intelligence over 65M+ business profiles and 6B+ data points, with hundreds of enrichment fields per company. Search and enrich companies, investors, and people; deep-intelligence dossiers; email finder + validator; tech-stack scanner; funding and hiring signals; logo API; AI-startup trends; prediction-market arbitrage; and an MCP server. Free tier, no signup. See /docs/api for usage.",
    "x-guidance": "Machine-payable AI startup intelligence. Call GET /api/mpp/company?slug=<startup-slug> (or ?domain=<company-domain>). Unpaid requests return 402 with an x402 / MPP payment challenge; pay the quoted amount (USDC on Base, about $0.02) and retry to receive the company profile, sectors, funding history, and detected tech stack. No API key or signup.",
    "contact": {
      "email": "support@startuphub.ai",
      "url": "https://www.startuphub.ai/contact"
    },
    "license": {
      "name": "API Terms",
      "url": "https://www.startuphub.ai/terms"
    }
  },
  "servers": [
    {
      "url": "https://www.startuphub.ai",
      "description": "Production"
    }
  ],
  "externalDocs": {
    "url": "https://www.startuphub.ai/docs/api",
    "description": "Full integration guide + MCP setup"
  },
  "x-service-info": {
    "categories": [
      "ai",
      "data"
    ],
    "docs": {
      "homepage": "https://www.startuphub.ai",
      "apiReference": "https://www.startuphub.ai/api-docs/keyless-payment"
    }
  },
  "components": {
    "securitySchemes": {
      "ApiKey": {
        "type": "apiKey",
        "in": "header",
        "name": "x-api-key"
      },
      "BearerToken": {
        "type": "http",
        "scheme": "bearer"
      }
    }
  },
  "paths": {
    "/api/v1/trends/current": {
      "get": {
        "summary": "Live AI startup ecosystem trends",
        "description": "Structured snapshot of the AI startup ecosystem right now: capital deployed this week, top sectors and countries with week-over-week deltas, biggest rounds, stage breakdown with median cheque sizes, emerging themes (companies clustering on the same narrow problem), most active investors, and exits. Sourced from the StartupHub.ai dataset (87K+ startups, 32K+ funding rounds). Free, no API key. Rate-limited to 10/day per IP for anonymous callers. This is the grounded-data alternative to LLM-generated trend reports.",
        "operationId": "getTrends",
        "responses": {
          "200": {
            "description": "Structured trends snapshot (JSON): capital, sectors, countries, rounds, stages, themes, investors, exits."
          },
          "429": {
            "description": "Anonymous daily rate limit reached, add an API key."
          }
        }
      }
    },
    "/api/v1/trends/sector": {
      "get": {
        "summary": "Sector / subsector trend analysis",
        "description": "Trends scoped to one sector or subsector: capital, rounds, momentum, and notable companies. Pass `sector` (a sector or subsector name) or `company` (resolves to that company's sectors). Companion to /api/v1/trends/current. Free, no API key.",
        "operationId": "getSectorTrends",
        "parameters": [
          {
            "name": "sector",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Sector or subsector name, e.g. \"Generative AI\"."
          },
          {
            "name": "company",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Company name; resolves to the sectors that company operates in."
          }
        ],
        "responses": {
          "200": {
            "description": "Sector trend analysis (JSON)."
          }
        }
      }
    },
    "/api/v1/arbitrage": {
      "get": {
        "summary": "Cross-venue prediction-market arbitrage board",
        "description": "The same real-world events priced on Polymarket, Kalshi/Robinhood, and PredictIt side by side, with a live arbitrage flagged whenever the combined cost of locking a $1 payout drops under $1. Refreshed every 30 minutes. Free, no API key; a paid Bearer key unlocks each leg's direct trade URL. Informational only: verify each market's resolution rules, fees, and withdrawal terms before trading.",
        "operationId": "getArbitrage",
        "parameters": [
          {
            "name": "arbs_only",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "0",
                "1"
              ]
            },
            "description": "Set to 1 to return only events with a live arbitrage right now."
          }
        ],
        "responses": {
          "200": {
            "description": "Matched-events board with per-leg pricing (JSON)."
          }
        }
      }
    },
    "/api/v1/intel/preview": {
      "post": {
        "summary": "Deep-intelligence dossier preview (free)",
        "description": "Free teaser for the public-record intelligence dossier on any person or company. Returns the resolved identity in full plus a redacted manifest of the locked sections and an unlock block. Anonymous, rate-limited. Strictly public records. Unlock the full dossier via /api/v1/intel/lookup. Accepts the identifier as a GET query param or a POST body.",
        "operationId": "intelPreview",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "query": {
                    "type": "string",
                    "description": "Any identifier: name, company, domain, LinkedIn URL, or email."
                  }
                },
                "required": [
                  "query"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Identity + redacted locked-section manifest + unlock block (JSON)."
          }
        }
      }
    },
    "/api/v1/intel/lookup": {
      "post": {
        "summary": "Deep-intelligence dossier (full)",
        "description": "Full public-record dossier on any person or company, resolving to person OR company: StartupHub data plus SEC EDGAR, IRS 990 (ProPublica), and more. Strictly public records: never private or dark-web data. Charges 10 credits. Accepts the identifier as a GET query param or a POST body. Bearer key required.",
        "operationId": "intelLookup",
        "security": [
          {
            "BearerToken": []
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "query": {
                    "type": "string",
                    "description": "Any identifier: name, company, domain, LinkedIn URL, or email."
                  }
                },
                "required": [
                  "query"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Full dossier with all sections (JSON)."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "402": {
            "description": "Out of intel credits for this plan."
          }
        }
      }
    },
    "/api/v1/enrich": {
      "post": {
        "summary": "AI-enrich a company",
        "description": "Full RAG enrichment for a company by name and/or website: profile, sectors, funding intel, detected tech stack, and more. Charges 1 enrich credit. Bearer key required (Pro Lite tier or higher).",
        "operationId": "enrichCompany",
        "security": [
          {
            "BearerToken": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string",
                    "description": "Company name (required)."
                  },
                  "website": {
                    "type": "string",
                    "description": "Company website URL."
                  },
                  "linkedin_url": {
                    "type": "string",
                    "description": "Company LinkedIn URL."
                  }
                },
                "required": [
                  "name"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Enriched company record (JSON)."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "402": {
            "description": "Out of enrich credits for this plan."
          }
        }
      }
    },
    "/api/v1/video": {
      "post": {
        "summary": "Turn an article (URL or pasted text) into a narrated video",
        "description": "Enqueues a render and returns a jobId immediately (rendering runs async, usually 2 to 4 minutes). Poll /api/v1/video/{jobId} until status is \"done\" for the mp4 URL. Charges 1 video credit on enqueue. Powers the Apify / Make.com / n8n automations.",
        "operationId": "createVideo",
        "security": [
          {
            "BearerToken": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Provide either url or text.",
                "properties": {
                  "url": {
                    "type": "string",
                    "format": "uri",
                    "description": "Article URL (any site; on-site /ai-news URLs use richer b-roll)",
                    "example": "https://example.com/post"
                  },
                  "text": {
                    "type": "string",
                    "description": "Article text (>= 200 chars). Used when url is omitted."
                  },
                  "title": {
                    "type": "string",
                    "description": "Optional title (auto-generated if omitted)"
                  },
                  "voice": {
                    "type": "string",
                    "enum": [
                      "en-US-AvaNeural",
                      "en-US-AndrewNeural",
                      "en-US-EmmaNeural",
                      "en-US-BrianNeural",
                      "en-US-JennyNeural",
                      "en-US-AriaNeural",
                      "en-US-GuyNeural",
                      "en-US-ChristopherNeural",
                      "en-US-MichelleNeural",
                      "en-GB-SoniaNeural",
                      "en-GB-RyanNeural",
                      "en-AU-NatashaNeural",
                      "en-IN-NeerjaNeural"
                    ],
                    "description": "Narrator voice (default Ava)"
                  },
                  "format": {
                    "type": "string",
                    "enum": [
                      "9:16",
                      "16:9"
                    ],
                    "description": "Vertical (default) or landscape"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Job enqueued: { jobId, status, poll_url }"
          },
          "400": {
            "description": "Invalid or too-short input"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Out of video credits for this plan"
          }
        }
      }
    },
    "/api/v1/video/{jobId}": {
      "get": {
        "summary": "Poll a video render job",
        "operationId": "getVideo",
        "security": [
          {
            "BearerToken": []
          }
        ],
        "parameters": [
          {
            "name": "jobId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Job status: { status: queued|claimed|rendering|done|failed, progress, mp4_url }"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "404": {
            "description": "No job with that id for this API key"
          }
        }
      }
    },
    "/api/v1/rewrite": {
      "post": {
        "summary": "AI text humanizer (rewrite prose, report diff stats)",
        "description": "Rewrite a passage so it reads as natural prose without changing meaning. Whole-document call (max 12 paragraphs, 20K chars). Charges 1 credit per call.",
        "operationId": "rewriteText",
        "security": [
          {
            "BearerToken": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "text"
                ],
                "properties": {
                  "text": {
                    "type": "string",
                    "description": "Passage to rewrite"
                  },
                  "strength": {
                    "type": "string",
                    "enum": [
                      "light",
                      "balanced",
                      "thorough"
                    ],
                    "default": "balanced"
                  },
                  "options": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "enum": [
                        "rhythm",
                        "destructure",
                        "tells",
                        "punctuation"
                      ]
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Rewritten text + per-paragraph diff stats"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "413": {
            "description": "Text too long or too many paragraphs"
          }
        }
      }
    },
    "/api/v1/clip": {
      "post": {
        "summary": "Render a YouTube clip (async)",
        "description": "Enqueue a vertical/landscape clip from a YouTube video. Caller supplies start/end timestamps and on-screen quote. Poll GET /api/v1/clip/{jobId}. Credits scale with length x quality.",
        "operationId": "createClip",
        "security": [
          {
            "BearerToken": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "start_seconds",
                  "end_seconds",
                  "quote"
                ],
                "properties": {
                  "video_url": {
                    "type": "string",
                    "format": "uri"
                  },
                  "video_id": {
                    "type": "string"
                  },
                  "start_seconds": {
                    "type": "number"
                  },
                  "end_seconds": {
                    "type": "number"
                  },
                  "quote": {
                    "type": "string",
                    "minLength": 8
                  },
                  "aspect": {
                    "type": "string",
                    "enum": [
                      "9:16",
                      "16:9"
                    ],
                    "default": "9:16"
                  },
                  "quality": {
                    "type": "string",
                    "enum": [
                      "720p",
                      "1080p"
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Job enqueued: { jobId, status, poll_url, cost }"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Insufficient credits"
          }
        }
      }
    },
    "/api/v1/clip/{jobId}": {
      "get": {
        "summary": "Poll a clip render job",
        "operationId": "getClip",
        "security": [
          {
            "BearerToken": []
          }
        ],
        "parameters": [
          {
            "name": "jobId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Clip job status + mp4_url when done"
          }
        }
      }
    },
    "/api/v1/youtube/transcript": {
      "get": {
        "summary": "YouTube transcript (raw captions + metadata)",
        "operationId": "getYouTubeTranscript",
        "security": [
          {
            "BearerToken": []
          }
        ],
        "parameters": [
          {
            "name": "url",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "YouTube URL or video id"
          }
        ],
        "responses": {
          "200": {
            "description": "Transcript + video metadata"
          },
          "422": {
            "description": "No transcript available"
          }
        }
      },
      "post": {
        "summary": "POST variant of YouTube transcript",
        "operationId": "postYouTubeTranscript",
        "security": [
          {
            "BearerToken": []
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "url"
                ],
                "properties": {
                  "url": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Transcript + video metadata"
          }
        }
      }
    },
    "/api/v1/youtube-to-article/generate": {
      "post": {
        "summary": "Turn a YouTube video into an article (HTML + Markdown + JSON-LD)",
        "operationId": "youtubeToArticle",
        "security": [
          {
            "BearerToken": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "url"
                ],
                "properties": {
                  "url": {
                    "type": "string",
                    "format": "uri"
                  },
                  "transcript_only": {
                    "type": "boolean",
                    "description": "Return transcript only, skip Gemini write"
                  },
                  "options": {
                    "type": "object",
                    "properties": {
                      "tone": {
                        "type": "string",
                        "enum": [
                          "neutral",
                          "analytical",
                          "conversational"
                        ]
                      },
                      "length": {
                        "type": "string",
                        "enum": [
                          "short",
                          "medium",
                          "long",
                          "auto"
                        ]
                      },
                      "include_embed": {
                        "type": "boolean"
                      },
                      "include_attribution": {
                        "type": "boolean"
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Article payload (html, markdown, jsonld, video meta)"
          },
          "429": {
            "description": "Quota exhausted"
          }
        }
      }
    },
    "/api/v1/x/transcript": {
      "post": {
        "summary": "Enqueue X.com video transcript (async Whisper job)",
        "operationId": "enqueueXTranscript",
        "security": [
          {
            "BearerToken": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "url"
                ],
                "properties": {
                  "url": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "{ job_id, status, poll_url }"
          }
        }
      },
      "get": {
        "summary": "Poll X.com transcript job",
        "operationId": "pollXTranscript",
        "security": [
          {
            "BearerToken": []
          }
        ],
        "parameters": [
          {
            "name": "job_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Job status + transcript when done"
          }
        }
      }
    },
    "/api/v1/visual-tldr/generate": {
      "post": {
        "summary": "Generate a Visual TL;DR flow diagram for an article",
        "operationId": "visualTldr",
        "security": [
          {
            "BearerToken": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "title",
                  "content_html"
                ],
                "properties": {
                  "title": {
                    "type": "string"
                  },
                  "content_html": {
                    "type": "string"
                  },
                  "excerpt": {
                    "type": "string"
                  },
                  "source_url": {
                    "type": "string",
                    "format": "uri"
                  },
                  "options": {
                    "type": "object",
                    "properties": {
                      "theme": {
                        "type": "string",
                        "enum": [
                          "default",
                          "midnight",
                          "cream",
                          "mint",
                          "slate"
                        ]
                      },
                      "font": {
                        "type": "string"
                      },
                      "include_attribution": {
                        "type": "boolean"
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "svg_html, html, image_url, markdown, jsonld"
          }
        }
      }
    },
    "/api/v1/rss": {
      "get": {
        "summary": "RSS feed generator for any website",
        "description": "Build an RSS feed for a site with no native feed. Free, anon rate-limited. Returns feed_xml in JSON.",
        "operationId": "generateRssFeed",
        "parameters": [
          {
            "name": "url",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uri"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "feed_xml + metadata"
          },
          "429": {
            "description": "Rate limit reached"
          }
        }
      }
    },
    "/api/v1/match": {
      "get": {
        "summary": "Investor / startup fit matching",
        "description": "Given a startup, return likely investors; given an investor, return fitting startups. 1 db credit.",
        "operationId": "entityMatch",
        "security": [
          {
            "BearerToken": []
          }
        ],
        "parameters": [
          {
            "name": "type",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "enum": [
                "startup",
                "investor"
              ]
            }
          },
          {
            "name": "slug",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "id",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Ranked matches with fit scores"
          },
          "404": {
            "description": "Entity not found"
          }
        }
      }
    },
    "/api/tools/effective-domain-rating": {
      "get": {
        "summary": "Effective Domain Rating (eDR vs Ahrefs DR)",
        "description": "Public, no API key. 0-100 realized visibility score with per-surface breakdown. CDN-cached.",
        "operationId": "effectiveDomainRating",
        "parameters": [
          {
            "name": "domain",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "keyword",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "eDR score + breakdown"
          }
        }
      }
    },
    "/api/tools/trust-reputation": {
      "get": {
        "summary": "Trust & reputation scanner (0-100 score)",
        "description": "Public, no API key. Security, privacy, malware, and reputation signals. CDN-cached.",
        "operationId": "trustReputation",
        "parameters": [
          {
            "name": "domain",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "company",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Trust score + breakdown"
          }
        }
      }
    },
    "/api/mpp/company": {
      "get": {
        "summary": "Company intelligence for an AI startup (pay-per-call via MPP / x402)",
        "description": "Profile, sectors, funding history, and detected tech stack for an AI company. Machine-payable: returns 402 with an MPP/x402 payment offer; pay with USDC on Base or a Stripe card, then retry. No API key, no signup. See /api-docs/keyless-payment.",
        "operationId": "getCompanyIntelligenceMpp",
        "parameters": [
          {
            "name": "slug",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "StartupHub startup slug, e.g. anthropic"
          },
          {
            "name": "domain",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Company domain (alternative to slug), e.g. anthropic.com"
          }
        ],
        "x-payment-info": {
          "price": {
            "mode": "fixed",
            "amount": "0.020000",
            "currency": "USD"
          },
          "protocols": [
            {
              "x402": {}
            },
            {
              "mpp": {
                "method": "evm",
                "intent": "charge",
                "currency": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"
              }
            }
          ]
        },
        "responses": {
          "200": {
            "description": "Company intelligence JSON."
          },
          "402": {
            "description": "Payment Required. Pay via MPP/x402 (WWW-Authenticate: Payment header + /.well-known/payment), then retry."
          }
        }
      }
    },
    "/api/agent-readiness/scan": {
      "post": {
        "summary": "Score a URL against the Agent Readiness Standard",
        "description": "Returns a 0–100 score, letter grade, per-dimension breakdown, and individual check results for any public URL. See /spec for the methodology.",
        "operationId": "scanAgentReadiness",
        "security": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "url"
                ],
                "properties": {
                  "url": {
                    "type": "string",
                    "format": "uri",
                    "example": "https://example.com"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Score and breakdown"
          }
        }
      },
      "get": {
        "summary": "GET variant, pass url as query parameter",
        "security": [],
        "parameters": [
          {
            "name": "url",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uri"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Score and breakdown"
          }
        }
      }
    },
    "/api/v1/email/discover": {
      "post": {
        "summary": "Discover an email address from name + domain",
        "operationId": "discoverEmail",
        "security": [
          {
            "ApiKey": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "name",
                  "domain"
                ],
                "properties": {
                  "name": {
                    "type": "string",
                    "example": "Daniel Singer"
                  },
                  "domain": {
                    "type": "string",
                    "example": "startuphub.ai"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Found email + confidence"
          }
        }
      }
    },
    "/api/v1/email/validate": {
      "post": {
        "summary": "Validate an email address (real-time SMTP probe)",
        "operationId": "validateEmail",
        "security": [
          {
            "ApiKey": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "email"
                ],
                "properties": {
                  "email": {
                    "type": "string",
                    "format": "email"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Validation verdict + signals"
          }
        }
      }
    },
    "/api/v1/monitor": {
      "get": {
        "summary": "List your monitor watches",
        "operationId": "listMonitorWatches",
        "security": [
          {
            "BearerToken": []
          }
        ],
        "responses": {
          "200": {
            "description": "Your active watches + plan caps"
          }
        }
      },
      "post": {
        "summary": "Create a monitor watch (5 credits), near-real-time webhooks on change",
        "operationId": "createMonitorWatch",
        "security": [
          {
            "BearerToken": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "url"
                ],
                "properties": {
                  "url": {
                    "type": "string",
                    "description": "Company website or domain to watch (e.g. acme.com)"
                  },
                  "signals": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "funding, jobs, tech, headcount, news, status, pricing, domains"
                  },
                  "frequency": {
                    "type": "string",
                    "enum": [
                      "weekly",
                      "daily",
                      "12h",
                      "4h"
                    ],
                    "description": "Poll cadence, clamped to your plan max"
                  },
                  "webhook_url": {
                    "type": "string",
                    "format": "uri",
                    "description": "HTTPS endpoint we POST {event, entity_id, title, body, metadata, delivered_at} to on each change"
                  },
                  "delivery_channels": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "enum": [
                        "email",
                        "slack",
                        "teams"
                      ]
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Watch created"
          },
          "402": {
            "description": "Plan watch limit reached"
          },
          "409": {
            "description": "Already watching this domain"
          }
        }
      },
      "delete": {
        "summary": "Cancel a monitor watch",
        "operationId": "deleteMonitorWatch",
        "security": [
          {
            "BearerToken": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Watch id to cancel"
          }
        ],
        "responses": {
          "200": {
            "description": "Cancelled"
          },
          "404": {
            "description": "Watch not found"
          }
        }
      }
    },
    "/api/v1/companies/technology": {
      "get": {
        "summary": "Get a company technology stack by domain",
        "operationId": "scanCompanyTechnology",
        "security": [
          {
            "BearerToken": []
          }
        ],
        "parameters": [
          {
            "name": "domain",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Company domain or URL, e.g. anthropic.com or https://anthropic.com/about"
          },
          {
            "name": "live",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean",
              "default": false
            },
            "description": "When true, force a fresh live fingerprint even if DB data exists."
          }
        ],
        "responses": {
          "200": {
            "description": "Technology stack from DB and/or live scan"
          }
        }
      },
      "post": {
        "summary": "POST variant of company technology scan",
        "operationId": "scanCompanyTechnologyPost",
        "security": [
          {
            "BearerToken": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "domain"
                ],
                "properties": {
                  "domain": {
                    "type": "string"
                  },
                  "live": {
                    "type": "boolean",
                    "default": false
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Technology stack from DB and/or live scan"
          }
        }
      }
    },
    "/api/v1/companies/mentions": {
      "get": {
        "summary": "A company's news (press) + podcast mentions",
        "description": "Press + podcast mentions for one company, merged and date-sorted. News comes from matched RSS/press posts (source URL + importance grade); podcast mentions include the verbatim snippet and a timestamped episode deep-link. Costs 1 credit.",
        "operationId": "getCompanyMentions",
        "security": [
          {
            "BearerToken": []
          }
        ],
        "parameters": [
          {
            "name": "slug",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Company slug, e.g. opusclip. Pass slug or domain."
          },
          {
            "name": "domain",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Company domain, e.g. opus.pro. Pass slug or domain."
          },
          {
            "name": "source",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "news",
                "podcast",
                "all"
              ],
              "default": "all"
            },
            "description": "Limit to one mention source."
          },
          {
            "name": "since",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Only mentions newer than this: a relative window like \"30d\" or an ISO date."
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 50,
              "maximum": 100
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Merged news + podcast mentions for the company"
          },
          "404": {
            "description": "No published company matched"
          }
        }
      },
      "post": {
        "summary": "POST variant of company mentions",
        "operationId": "getCompanyMentionsPost",
        "security": [
          {
            "BearerToken": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "slug": {
                    "type": "string"
                  },
                  "domain": {
                    "type": "string"
                  },
                  "source": {
                    "type": "string",
                    "enum": [
                      "news",
                      "podcast",
                      "all"
                    ],
                    "default": "all"
                  },
                  "since": {
                    "type": "string"
                  },
                  "limit": {
                    "type": "integer",
                    "default": 50
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Merged news + podcast mentions for the company"
          }
        }
      }
    },
    "/api/v1/news/mentions": {
      "get": {
        "summary": "Companies mentioned recently across news + podcasts",
        "description": "Reverse discovery: the companies mentioned most across press and podcasts in a recent window, ranked by mention count, each with per-source counts, the latest mention, and a profile link. Costs 2 credits.",
        "operationId": "getRecentMentions",
        "security": [
          {
            "BearerToken": []
          }
        ],
        "parameters": [
          {
            "name": "source",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "news",
                "podcast",
                "all"
              ],
              "default": "all"
            }
          },
          {
            "name": "since",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "default": "7d"
            },
            "description": "Window: relative like \"7d\"/\"30d\" or an ISO date. Defaults to 7d."
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 50,
              "maximum": 100
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Ranked list of recently-mentioned companies"
          }
        }
      },
      "post": {
        "summary": "POST variant of recent mentions discovery",
        "operationId": "getRecentMentionsPost",
        "security": [
          {
            "BearerToken": []
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "source": {
                    "type": "string",
                    "enum": [
                      "news",
                      "podcast",
                      "all"
                    ],
                    "default": "all"
                  },
                  "since": {
                    "type": "string",
                    "default": "7d"
                  },
                  "limit": {
                    "type": "integer",
                    "default": 50
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Ranked list of recently-mentioned companies"
          }
        }
      }
    },
    "/api/v1/startups": {
      "get": {
        "summary": "Search the AI startup directory",
        "operationId": "searchStartups",
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "sector",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "country",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "stage",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 20,
              "maximum": 100
            }
          }
        ],
        "responses": {
          "200": {
            "description": "List of matching startups"
          }
        }
      }
    },
    "/api/v1/investors": {
      "get": {
        "summary": "Search investors",
        "operationId": "searchInvestors",
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "investor_type",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 20
            }
          }
        ],
        "responses": {
          "200": {
            "description": "List of matching investors"
          }
        }
      }
    },
    "/api/v1/people": {
      "get": {
        "summary": "Search people (founders, operators, investors)",
        "operationId": "searchPeople",
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 20
            }
          }
        ],
        "responses": {
          "200": {
            "description": "List of matching people"
          }
        }
      }
    },
    "/api/cohorts": {
      "get": {
        "summary": "List accelerator / batch cohorts",
        "operationId": "listCohorts",
        "security": [],
        "parameters": [
          {
            "name": "investor",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "status",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "upcoming",
                "applications_open",
                "in_progress",
                "completed"
              ]
            }
          },
          {
            "name": "open",
            "in": "query",
            "schema": {
              "type": "integer",
              "enum": [
                1
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "List of cohorts"
          }
        }
      }
    },
    "/api/cohorts/{id}": {
      "get": {
        "summary": "Single cohort with member list",
        "operationId": "getCohort",
        "security": [],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Cohort UUID or investor-slug/cohort-slug (e.g. y-combinator/w26)"
          }
        ],
        "responses": {
          "200": {
            "description": "Cohort + members"
          }
        }
      }
    }
  }
}