{
  "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 /api-docs 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/api-docs",
    "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": {
      "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). Takes no parameters: the window is always the last 7 days against the 7 before. 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`, `website` or `linkedin` (each resolves to that company's sectors). Companion to /api/v1/trends/current. Free, no API key: anonymous callers share a daily rate limit, and a valid Bearer key skips it.",
        "operationId": "getSectorTrends",
        "parameters": [
          {
            "name": "sector",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Sector or subsector name, e.g. \"Generative AI\". Comma-separated, up to 4."
          },
          {
            "name": "company",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Company name; resolves to the sectors that company operates in (up to 4)."
          },
          {
            "name": "website",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Company website or domain, e.g. openai.com; resolves to its sectors."
          },
          {
            "name": "linkedin",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Company LinkedIn URL or slug; resolves to its sectors."
          },
          {
            "name": "years",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 10,
              "default": 5
            },
            "description": "Lookback window in years."
          },
          {
            "name": "deep",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "true",
                "1"
              ]
            },
            "description": "Adds a qualitative read: saturation, differentiation, barriers to entry, tech reproducibility."
          }
        ],
        "responses": {
          "200": {
            "description": "Sector trend analysis (JSON)."
          },
          "400": {
            "description": "None of sector, company, website or linkedin was given."
          },
          "404": {
            "description": "No company matched, or no companies in that sector."
          },
          "422": {
            "description": "The matched company has no sectors assigned."
          },
          "429": {
            "description": "Anonymous daily rate limit reached, add an API key."
          }
        }
      },
      "post": {
        "summary": "POST variant of sector trends",
        "operationId": "getSectorTrendsPost",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "sector": {
                    "type": "string"
                  },
                  "company": {
                    "type": "string"
                  },
                  "website": {
                    "type": "string"
                  },
                  "linkedin": {
                    "type": "string"
                  },
                  "years": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 10,
                    "default": 5
                  },
                  "deep": {
                    "type": [
                      "boolean",
                      "string"
                    ],
                    "description": "true, \"true\" or \"1\"."
                  }
                }
              }
            }
          }
        },
        "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",
                "true"
              ]
            },
            "description": "Set to 1 or true (case-insensitive) to return only events with a live arbitrage right now. Any other value returns the full board."
          }
        ],
        "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": [
          {
            "BearerToken": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "firstName",
                  "lastName",
                  "domain"
                ],
                "properties": {
                  "firstName": {
                    "type": "string",
                    "example": "Daniel"
                  },
                  "lastName": {
                    "type": "string",
                    "example": "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": [
          {
            "BearerToken": []
          }
        ],
        "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": "website",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Alias of 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"
                  },
                  "website": {
                    "type": "string",
                    "description": "Alias of domain."
                  },
                  "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",
        "description": "Every filter the endpoint reads. Comma-separated filters match any of their values; different filters combine with AND. The filter for the latest funding stage is round_series. 1 db credit.",
        "operationId": "searchStartups",
        "security": [
          {
            "BearerToken": []
          }
        ],
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Search text, matched against the name and one-liner."
          },
          {
            "name": "slugs",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Comma-separated StartupHub slugs, up to 100, lowercased before matching; matches any of them. Fetches known companies in one call."
          },
          {
            "name": "sector",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Comma-separated sector names, e.g. \"Fintech,Cybersecurity\"; matches any of them. Exact sector names as shown on profiles."
          },
          {
            "name": "country",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Comma-separated countries; matches any of them. Accepts names or ISO codes; \"US\", \"USA\" and \"United States\" are the same."
          },
          {
            "name": "status",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Operating status. Exact, case-sensitive match on the stored value, for example Active or Inactive."
          },
          {
            "name": "founded_after",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Founded on or after this date: YYYY, YYYY-MM or YYYY-MM-DD."
          },
          {
            "name": "founded_before",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Founded on or before this date: YYYY, YYYY-MM or YYYY-MM-DD."
          },
          {
            "name": "near",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "HQ inside a bounding box around a point: \"lat,lng,radius_km\", radius clamped to 1-500 km. A malformed value applies no filter. Example \"51.507,-0.128,25\" for central London."
          },
          {
            "name": "open_source",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "true",
                "false"
              ]
            },
            "description": "'true' returns only open-source companies."
          },
          {
            "name": "employees_min",
            "in": "query",
            "schema": {
              "type": "number"
            },
            "description": "Minimum employee count (inclusive)."
          },
          {
            "name": "employees_max",
            "in": "query",
            "schema": {
              "type": "number"
            },
            "description": "Maximum employee count (inclusive). Use 10 for tiny teams."
          },
          {
            "name": "min_linkedin_followers",
            "in": "query",
            "schema": {
              "type": "number"
            },
            "description": "Minimum LinkedIn followers, a brand-size proxy when headcount is unknown."
          },
          {
            "name": "max_linkedin_followers",
            "in": "query",
            "schema": {
              "type": "number"
            },
            "description": "Maximum LinkedIn followers."
          },
          {
            "name": "hiring",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "true"
              ]
            },
            "description": "'true' returns only companies with open roles right now."
          },
          {
            "name": "round_series",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Comma-separated stages of the most recent funding round; matches any of them. Values: Angel, Pre-Seed, Seed, Pre-Series A, Series A to Series H, Growth, Debt, Grant, Strategic, IPO. Pair with raised_after for \"just raised a seed round\"."
          },
          {
            "name": "raised_after",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Most recent funding round announced on or after this date: YYYY, YYYY-MM or YYYY-MM-DD."
          },
          {
            "name": "raised_before",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Most recent funding round announced on or before this date: YYYY, YYYY-MM or YYYY-MM-DD."
          },
          {
            "name": "min_total_funding",
            "in": "query",
            "schema": {
              "type": "number"
            },
            "description": "Minimum total funding raised, USD."
          },
          {
            "name": "max_total_funding",
            "in": "query",
            "schema": {
              "type": "number"
            },
            "description": "Maximum total funding raised, USD."
          },
          {
            "name": "min_valuation",
            "in": "query",
            "schema": {
              "type": "number"
            },
            "description": "Minimum latest valuation, USD. 1000000000 for unicorns."
          },
          {
            "name": "max_valuation",
            "in": "query",
            "schema": {
              "type": "number"
            },
            "description": "Maximum latest valuation, USD."
          },
          {
            "name": "backed_by",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Comma-separated investors, up to 20, by StartupHub slug or exact name, e.g. \"sequoia-capital,Y Combinator\"; matches any of them. When none of them matches an investor, the response is empty data plus a note."
          },
          {
            "name": "ma_status",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Comma-separated exit states: acquired, public, merged, made_acquisitions; matches any of them."
          },
          {
            "name": "min_score",
            "in": "query",
            "schema": {
              "type": "number"
            },
            "description": "Minimum StartupHub score (0-100). 70+ is roughly the top 1.5%."
          },
          {
            "name": "max_score",
            "in": "query",
            "schema": {
              "type": "number"
            },
            "description": "Maximum StartupHub score."
          },
          {
            "name": "min_agent_readiness",
            "in": "query",
            "schema": {
              "type": "number"
            },
            "description": "Minimum Agent Readiness score (0-100): how well AI agents can use the company website."
          },
          {
            "name": "max_agent_readiness",
            "in": "query",
            "schema": {
              "type": "number"
            },
            "description": "Maximum Agent Readiness score."
          },
          {
            "name": "agent_readiness_grade",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Comma-separated Agent Readiness grades: A+, A, B, C, D, F; matches any of them."
          },
          {
            "name": "min_revenue_multiple",
            "in": "query",
            "schema": {
              "type": "number"
            },
            "description": "Minimum valuation-to-revenue multiple (sparse)."
          },
          {
            "name": "max_revenue_multiple",
            "in": "query",
            "schema": {
              "type": "number"
            },
            "description": "Maximum valuation-to-revenue multiple."
          },
          {
            "name": "min_revenue_per_employee",
            "in": "query",
            "schema": {
              "type": "number"
            },
            "description": "Minimum revenue per employee, USD (sparse)."
          },
          {
            "name": "max_revenue_per_employee",
            "in": "query",
            "schema": {
              "type": "number"
            },
            "description": "Maximum revenue per employee, USD."
          },
          {
            "name": "min_funding_efficiency",
            "in": "query",
            "schema": {
              "type": "number"
            },
            "description": "Minimum revenue per dollar raised (sparse)."
          },
          {
            "name": "max_funding_efficiency",
            "in": "query",
            "schema": {
              "type": "number"
            },
            "description": "Maximum revenue per dollar raised."
          },
          {
            "name": "trending",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "true"
              ]
            },
            "description": "'true' returns companies getting attention on StartupHub this week."
          },
          {
            "name": "mentioned_since",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Covered in StartupHub news on or after this date: YYYY, YYYY-MM or YYYY-MM-DD."
          },
          {
            "name": "min_reddit_reviews",
            "in": "query",
            "schema": {
              "type": "number"
            },
            "description": "Minimum number of classified Reddit reviews."
          },
          {
            "name": "min_reddit_sentiment",
            "in": "query",
            "schema": {
              "type": "number"
            },
            "description": "Minimum Reddit sentiment, -100 to 100. Pair with min_reddit_reviews."
          },
          {
            "name": "has_founders",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "true",
                "false"
              ]
            },
            "description": "'true' returns only companies with known founders, ready for list_startup_team."
          },
          {
            "name": "has_known_emails",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "true",
                "false"
              ]
            },
            "description": "'true' returns only companies with at least one verified founder or team email. Pro Lite and up; Pro Lite sees redacted addresses, Pro sees them in full."
          },
          {
            "name": "has_website",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "true",
                "false"
              ]
            },
            "description": "'true' returns only companies with a website on file."
          },
          {
            "name": "has_blog",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "true",
                "false"
              ]
            },
            "description": "'true' returns only companies whose website has a blog or news feed we found (RSS or Atom), 'false' only those checked and without one. Sites are rechecked every 90 days."
          },
          {
            "name": "blog_post_within_days",
            "in": "query",
            "schema": {
              "type": "number"
            },
            "description": "Only companies whose blog published a post within this many days (30, 90 or 365 are the usual values). Implies has_blog=true."
          },
          {
            "name": "website_status",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Comma-separated website states: active, dead, parked; matches any of them."
          },
          {
            "name": "domain_tld",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Comma-separated domain endings, e.g. \"ai,io\"; matches any of them."
          },
          {
            "name": "stealth",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "true",
                "false"
              ]
            },
            "description": "'true' = stealth only, 'false' = exclude stealth. Stealth rows need Pro Lite or higher."
          },
          {
            "name": "cdn",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Comma-separated CDNs: cloudflare, vercel, cloudfront, fastly, netlify; matches any of them."
          },
          {
            "name": "email_provider",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Comma-separated email providers: google_workspace, m365, zoho, proton, proofpoint, mimecast, self_hosted, gateway; matches any of them."
          },
          {
            "name": "hosting",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Comma-separated hosting providers: aws, azure, gcp, vercel, render, netlify, hetzner, digitalocean; matches any of them."
          },
          {
            "name": "payment",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Comma-separated payment providers: stripe, paddle, lemonsqueezy, paypal, klarna, apple_pay; matches any of them. The API also accepts payments as an alias."
          },
          {
            "name": "compliance",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Comma-separated compliance claims found on the site: soc2, hipaa, iso27001, gdpr, ccpa, pci_dss, fedramp; matches any of them."
          },
          {
            "name": "status_page",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Comma-separated status page vendors: statuspage, instatus, betterstack; matches any of them."
          },
          {
            "name": "cookie_consent",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Comma-separated cookie consent vendors: onetrust, cookiebot, osano, termly; matches any of them."
          },
          {
            "name": "hiring_platform",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Comma-separated hiring platforms: greenhouse, lever, ashby, workable, teamtailor; matches any of them."
          },
          {
            "name": "booking",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Comma-separated booking widgets: calendly, calcom, savvycal, chilipiper; matches any of them."
          },
          {
            "name": "email_marketing",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Comma-separated email marketing tools: klaviyo, mailchimp, hubspot_forms, customer_io, loops; matches any of them."
          },
          {
            "name": "ai_support",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Comma-separated AI customer support tools: intercom_fin, ada, sierra, decagon, drift_ai, fin_ai; matches any of them."
          },
          {
            "name": "a11y",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Comma-separated accessibility overlays: userway, accessibe, audioeye; matches any of them."
          },
          {
            "name": "affiliate_program",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Comma-separated affiliate platforms: partnerstack, rewardful, tolt, firstpromoter, impact; matches any of them."
          },
          {
            "name": "has_affiliate_program",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "true",
                "false"
              ]
            },
            "description": "'true' returns only companies running an affiliate program."
          },
          {
            "name": "sort",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "'<column>.<asc|desc>'. Columns: total_score, created_at (when StartupHub added the row), last_round_date, latest_funding_date (alias of last_round_date), total_funding, latest_valuation, founded_date, employee_count, employee_growth_quarterly_cagr, linkedin_followers, agent_readiness_score, trending_score_7d, current_revenue, revenue_multiple, revenue_per_employee, funding_efficiency. Default total_score.desc. An unknown column falls back to total_score.desc, and any direction other than asc sorts descending."
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "number",
              "default": 20,
              "maximum": 100
            },
            "description": "Results per call. Default 20, max 100."
          },
          {
            "name": "offset",
            "in": "query",
            "schema": {
              "type": "number"
            },
            "description": "Skip this many results, to page past the first 100."
          }
        ],
        "responses": {
          "200": {
            "description": "List of matching startups with pagination { total, limit, offset }"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "403": {
            "description": "Filter requires a higher tier (e.g. has_known_emails=true on Free)"
          },
          "429": {
            "description": "Daily rate limit exceeded"
          }
        }
      }
    },
    "/api/v1/domains": {
      "get": {
        "summary": "Domain radar: newly registered names (not company profiles)",
        "description": "Newly registered names from NRD feeds, company registries, and GitHub orgs. Always sorted newest first (created_at desc). Pro Lite and higher. 1 db credit.",
        "operationId": "searchDomains",
        "security": [
          {
            "BearerToken": []
          }
        ],
        "parameters": [
          {
            "name": "tld",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Comma-separated TLDs. Only ai, io, xyz, so, com and security filter anything; other values apply no filter. Combined with source by OR."
          },
          {
            "name": "source",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Comma-separated raw source or bucket ids, e.g. dot_ai_nrd, dot_ai_zone, github_new_org, uk_companies_house."
          },
          {
            "name": "status",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Comma-separated: queued, quality_failed, promoted, rejected. Default queued,quality_failed."
          },
          {
            "name": "apex",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Exact hostname, e.g. acme.ai. A leading www. is stripped; a value with no dot returns 400 invalid_apex. Overrides q."
          },
          {
            "name": "q",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Substring of apex or candidate name. Needs at least 2 characters after removing % _ and commas."
          },
          {
            "name": "created_after",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "ISO date. First ingested on or after this time."
          },
          {
            "name": "created_before",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "ISO date. First ingested on or before this time."
          },
          {
            "name": "has_real_email",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "true",
                "false"
              ]
            },
            "description": "Domain has a mailbox (MX)."
          },
          {
            "name": "has_real_content",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "true",
                "false"
              ]
            },
            "description": "Last homepage probe had real body copy."
          },
          {
            "name": "is_parked",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "true",
                "false"
              ]
            }
          },
          {
            "name": "promoted",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "true",
                "false"
              ]
            },
            "description": "true = only names that already have a public startup profile."
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 20,
              "minimum": 1,
              "maximum": 100
            }
          },
          {
            "name": "offset",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 0,
              "minimum": 0
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Domain radar rows with pagination"
          },
          "400": {
            "description": "invalid_apex: apex has no dot"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "403": {
            "description": "Free tier; requires Pro Lite or higher"
          },
          "429": {
            "description": "Daily rate limit exceeded"
          }
        }
      }
    },
    "/api/v1/investors": {
      "get": {
        "summary": "Search investors",
        "description": "Search VCs, angels, accelerators and other investors. 1 db credit.",
        "operationId": "searchInvestors",
        "security": [
          {
            "BearerToken": []
          }
        ],
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Matches name or description."
          },
          {
            "name": "country",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "HQ country, exact match."
          },
          {
            "name": "type",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Exact, case-sensitive match on the stored investor type, for example VC, Angel, Accelerator, Corporate VC, Family Office, PE."
          },
          {
            "name": "sector_focus",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Comma-separated; the investor must carry all of them."
          },
          {
            "name": "stage_focus",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Comma-separated stages, e.g. Seed; the investor must carry all of them. series_focus is accepted as an alias."
          },
          {
            "name": "geo_focus",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Comma-separated regions; the investor must carry all of them."
          },
          {
            "name": "cheque_min",
            "in": "query",
            "schema": {
              "type": "number"
            },
            "description": "Matches investors whose max_cheque_size is at least this (USD)."
          },
          {
            "name": "cheque_max",
            "in": "query",
            "schema": {
              "type": "number"
            },
            "description": "Matches investors whose min_cheque_size is at most this (USD)."
          },
          {
            "name": "active_since",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date"
            },
            "description": "Latest investment (last_investment_date) on or after this date."
          },
          {
            "name": "min_recent_rounds_90d",
            "in": "query",
            "schema": {
              "type": "integer"
            },
            "description": "Minimum number of rounds in the last 90 days."
          },
          {
            "name": "actively_investing",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "true"
              ]
            },
            "description": "Only true filters."
          },
          {
            "name": "sort",
            "in": "query",
            "schema": {
              "type": "string",
              "default": "total_score.desc"
            },
            "description": "<column>.<asc|desc>. Columns: total_score, last_investment_date, recent_rounds_90d, recent_lead_rounds_90d, total_funds_raised, min_cheque_size, max_cheque_size, last_mentioned_at, created_at. An unknown column falls back to the default."
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 20,
              "maximum": 100
            }
          },
          {
            "name": "offset",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 0
            }
          }
        ],
        "responses": {
          "200": {
            "description": "List of matching investors"
          },
          "401": {
            "description": "Missing or invalid API key"
          }
        }
      }
    },
    "/api/v1/people": {
      "get": {
        "summary": "Search people (founders, operators, investors)",
        "description": "Sorted by StartupHub score, highest first; there is no sort parameter. 1 db credit.",
        "operationId": "searchPeople",
        "security": [
          {
            "BearerToken": []
          }
        ],
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Matches name or title."
          },
          {
            "name": "country",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Exact match."
          },
          {
            "name": "title",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Partial match on the current title."
          },
          {
            "name": "sector",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "One exact sector name; commas are not split."
          },
          {
            "name": "tag",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "One tag, e.g. Unit 8200, Serial Entrepreneur, Has Exits."
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 20,
              "maximum": 100
            }
          },
          {
            "name": "offset",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 0
            }
          }
        ],
        "responses": {
          "200": {
            "description": "List of matching people"
          },
          "401": {
            "description": "Missing or invalid API key"
          }
        }
      }
    },
    "/api/v1/analysis/query": {
      "get": {
        "summary": "Funding totals by country, sector, series and year",
        "description": "One total from the /analysis chart: round count, USD total, breakdown and chart URL. dataset=rounds (default) is announced capital in the year; dataset=startups is companies founded that year with capital raised to date. Free, no API key; anonymous callers share a daily cap.",
        "operationId": "queryFunding",
        "security": [],
        "parameters": [
          {
            "name": "country",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Full English name or common alias (Canada, USA, UK). Comma-separated, up to 8."
          },
          {
            "name": "countries",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Alias of country."
          },
          {
            "name": "sector",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Sector name. Comma-separated, up to 8."
          },
          {
            "name": "sectors",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Alias of sector."
          },
          {
            "name": "series",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "dataset=rounds only. Exact, case-sensitive: Pre-Seed, Seed, Series A, Series B, Series C, Series D, Series E, Series F+, Growth, IPO, Debt, Grant, Strategic, Unlabeled. Comma-separated; other values are dropped."
          },
          {
            "name": "year",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1970,
              "maximum": 2100
            },
            "description": "Sets both from and to."
          },
          {
            "name": "from",
            "in": "query",
            "schema": {
              "type": "integer"
            },
            "description": "First year. Defaults per dataset: rounds 2021, funds 2015, startups 2010, investors 1995. Clamped to the dataset range."
          },
          {
            "name": "to",
            "in": "query",
            "schema": {
              "type": "integer"
            },
            "description": "Last year. Defaults to the current year. Clamped between from and the current year."
          },
          {
            "name": "dataset",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "rounds",
                "funds",
                "startups",
                "investors"
              ],
              "default": "rounds"
            }
          },
          {
            "name": "group",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "time",
                "series",
                "size",
                "sector",
                "country"
              ],
              "default": "time"
            },
            "description": "funds and startups have no series; investors allows only time, sector, country. An invalid value becomes time."
          },
          {
            "name": "bucket",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "month",
                "quarter",
                "year"
              ]
            },
            "description": "Defaults to year for a single year and quarter for a range."
          },
          {
            "name": "split",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "none",
                "series",
                "size",
                "sector",
                "country"
              ],
              "default": "none"
            },
            "description": "Second breakdown: one of the dataset dimensions, not equal to group. Anything else means none."
          }
        ],
        "responses": {
          "200": {
            "description": "Total, count, breakdown and chart URL (JSON)."
          },
          "429": {
            "description": "Anonymous daily cap reached."
          },
          "500": {
            "description": "The total could not be computed."
          }
        }
      }
    },
    "/api/v1/companies/hiring": {
      "get": {
        "summary": "Companies opening the most roles recently",
        "description": "Ranked by roles opened in the period, from our ATS jobs index. 1 credit.",
        "operationId": "getHiringCompanies",
        "security": [
          {
            "BearerToken": []
          }
        ],
        "parameters": [
          {
            "name": "period",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "day",
                "week",
                "month"
              ],
              "default": "week"
            },
            "description": "Any other value means week."
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 50,
              "minimum": 1,
              "maximum": 100
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Ranked hiring companies"
          },
          "401": {
            "description": "Missing or invalid API key"
          }
        }
      }
    },
    "/api/v1/startups/movers": {
      "get": {
        "summary": "Biggest StartupHub score risers and fallers",
        "description": "Computed from daily ranking snapshots. Pro Lite and higher. 1 db credit.",
        "operationId": "getStartupMovers",
        "security": [
          {
            "BearerToken": []
          }
        ],
        "parameters": [
          {
            "name": "period",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "7d",
                "30d",
                "90d"
              ],
              "default": "30d"
            },
            "description": "Any other value means 30d."
          },
          {
            "name": "direction",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "up",
                "down"
              ],
              "default": "up"
            },
            "description": "up = risers, down = fallers."
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 20,
              "minimum": 1,
              "maximum": 100
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Score movers"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "403": {
            "description": "Free tier; requires Pro Lite or higher"
          }
        }
      }
    },
    "/api/cohorts": {
      "get": {
        "summary": "List accelerator / batch cohorts",
        "operationId": "listCohorts",
        "security": [],
        "parameters": [
          {
            "name": "investor",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Investor slug, e.g. y-combinator."
          },
          {
            "name": "status",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "upcoming",
                "applications_open",
                "in_progress",
                "completed",
                "cancelled"
              ]
            },
            "description": "Ignored when open=1."
          },
          {
            "name": "open",
            "in": "query",
            "schema": {
              "type": "integer",
              "enum": [
                1
              ]
            },
            "description": "Shortcut for status upcoming or applications_open, ordered by application deadline."
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 50,
              "minimum": 1,
              "maximum": 200
            }
          }
        ],
        "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"
          }
        }
      }
    }
  }
}