# checkov:skip=CKV_OPENAPI_5: /health intentionally opts out of global auth via security: []
# checkov:skip=CKV_OPENAPI_21: array schemas without maxItems are intentional for telemetry shapes
openapi: 3.1.0
info:
  title: Dealroom API
  version: '2026-09-01'
  description: >-
    REST API for the Dealroom platform — companies, funds, founders, investors, funding rounds, valuations, taxonomy, news, and aggregate analytics across all of them. Authentication uses Auth0 (Bearer JWT or OAuth2 client_credentials). All endpoints are versioned via the `API-Version` header (Stripe-style date-based versioning).
  contact:
    name: Dealroom API support
    email: support@dealroom.co
    url: 'https://dealroom.co'
  termsOfService: 'https://dealroom.co/terms'
  license:
    name: Proprietary — Dealroom commercial license
    url: 'https://dealroom.co/terms'
servers:
  - url: https://api.beta.dealroom.app
    description: Beta
security:
  - bearerAuth: []
  - oauth2: []
tags:
  - name: Discovery
    description: API root discovery and functional namespaces.
  - name: Entities
    description: >-
      Companies, investors, people, universities, and other organisations. Filter, sort, and paginate the unified entity index. The term `investor` refers to the investment firm; `fund` refers to the capital vehicle it raises.
  - name: Companies
    description: >-
      Company profiles — the `organization_subtype = company` subset of entities (excludes investors, universities, and gov/NGOs). Same response shape as the entity index, scoped to companies.
  - name: Universities
    description: >-
      University profiles — the `organization_subtype = university` subset of entities. The `university` sub-object carries alumni metrics.
  - name: Government & NGO
    description: Government bodies and NGOs — the `organization_subtype = gov_ngo` subset of entities.
  - name: Transactions
    description: 'Funding rounds, equity events, debt, grants, exits, and other company-level financial events.'
  - name: Valuations
    description: Company valuation history by year and month.
  - name: Investors
    description: >-
      Investor profiles (VCs, corporates, angels, family offices, governments). Subset of entities where `is_investor = true`. An investor is the firm that makes investments; the capital vehicles it raises are funds available via `/investors/{id}/funds`.
  - name: Funds
    description: >-
      Funds — the capital vehicles investor firms raise (e.g. "Fund III", $200M, 2024). Browse/filter by manager, type, size, and vintage; each fund links to its manager (GP). Fund size (`amount`) converts to the requested `?currency=` (default USD); `amount_source` carries the original native-currency amount.
  - name: People
    description: >-
      Person profiles (founders, executives, angels, and others). Subset of entities where `entity_type = 'person'`. Same response shape as founders, with company associations, education, and backgrounds.
  - name: Founders
    description: >-
      Founder profiles with company associations and education history. Subset of entities where `is_founder = true`.
  - name: News
    description: 'Curated news articles about companies, funds, deals, sectors, and events.'
  - name: Jobs
    description: 'Active job openings posted by companies, with hiring-trend signals.'
  - name: Aggregate
    description: >-
      Composable single- and multi-metric aggregations across companies, funding rounds, valuations, founders, investors, entities, and fundings.
  - name: Timeseries
    description: 'Yearly entity metrics (employees, revenue, valuation).'
  - name: Filters
    description: >-
      Filter registry discovery and value lookup. Use `/reference/filters` to discover available filters per scope and `/reference/filters/:key/values` to look up valid values.
  - name: Health
    description: 'Liveness probe (public, unauthenticated).'
  - name: Search
    description: >-
      Cross-resource fuzzy search across companies, investors, people, universities, and government & NGO bodies.
x-tagGroups:
  - name: Data
    tags:
      - Entities
      - Companies
      - Universities
      - Government & NGO
      - Transactions
      - Valuations
      - Investors
      - Funds
      - People
      - Founders
      - News
      - Jobs
      - Search
  - name: Analytics
    tags:
      - Aggregate
      - Timeseries
  - name: Reference
    tags:
      - Discovery
      - Filters
components:
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: >-
        Auth0 JWT access token. Paste a token obtained from your preferred OAuth2 flow. For machine-to-machine use, the OAuth2 client_credentials scheme below can mint a token directly from your `client_id` / `client_secret` inside the Swagger UI Authorize dialog.
    oauth2:
      type: oauth2
      description: >-
        OAuth2 client-credentials flow against the Dealroom Auth0 tenant. Use the `client_id` / `client_secret` from a Programmatic API key. Tokens are valid for 24h — Swagger UI will reuse the same token across operations. Revoking or deactivating a key rejects it on the next request (within a ≤5-minute server-side cache window), not at token expiry.
      flows:
        clientCredentials:
          tokenUrl: 'https://accounts.dealroom.co/oauth/token'
          scopes:
            'read:entities': 'Grant the read:entities permission'
            'read:transactions': 'Grant the read:transactions permission'
            'read:valuations': 'Grant the read:valuations permission'
            'read:investors': 'Grant the read:investors permission'
            'read:founders': 'Grant the read:founders permission'
            'read:dimensions': 'Grant the read:dimensions permission'
            'read:timeseries': 'Grant the read:timeseries permission'
            'read:aggregate': 'Grant the read:aggregate permission'
            'read:news': 'Grant the read:news permission'
            'read:jobs': 'Grant the read:jobs permission'
            'read:people': 'Grant the read:people permission'
            'read:search': 'Grant the read:search permission'
  schemas:
    HealthResponse:
      type: object
      properties:
        status:
          type: string
        timestamp:
          type: string
        database:
          type: string
      required:
        - status
        - timestamp
        - database
    DiscoveryResponse:
      type: object
      properties:
        version:
          type: string
          example: '2026-06-15'
        groups:
          type: object
          additionalProperties:
            type: object
            properties:
              description:
                type: string
              url:
                type: string
            required:
              - description
              - url
            example:
              description: 'Core domain entities (companies, investors, founders).'
              url: /data
        docs:
          type: string
          format: uri
          example: 'https://developers.dealroom.co'
        openapi:
          type: string
          example: /openapi
      required:
        - version
        - groups
        - docs
    NamespaceDiscoveryResponse:
      type: object
      properties:
        version:
          type: string
          example: '2026-06-15'
        namespace:
          type: string
          example: data
        description:
          type: string
        resources:
          type: object
          additionalProperties:
            type: object
            properties:
              description:
                type: string
              url:
                type: string
            required:
              - description
              - url
            example:
              description: 'Core domain entities (companies, investors, founders).'
              url: /data
        docs:
          type: string
          format: uri
          example: 'https://developers.dealroom.co'
        openapi:
          type: string
          example: /openapi
      required:
        - version
        - namespace
        - description
        - resources
        - docs
    EntityListResponse:
      type: object
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/Entity'
        page:
          type: object
          properties:
            total:
              type: number
            limit:
              type: number
            offset:
              type: number
            next_cursor:
              type:
                - string
                - 'null'
              description: Opaque cursor for the next page. Null when no further pages exist.
            prev_cursor:
              type:
                - string
                - 'null'
              description: Opaque cursor for the previous page. Null when on the first page.
            capped:
              type: boolean
              description: True when the requested page size was reduced to the per-tier/ecosystem row cap.
            tier:
              type: string
              enum:
                - anonymous
                - free
                - premium
              description: 'The access tier applied to this request (anonymous, free, premium).'
            ecosystem:
              type:
                - string
                - 'null'
              description: 'Slug of the active ecosystem subdomain, or null when none is in scope.'
          required:
            - limit
            - offset
            - next_cursor
            - prev_cursor
        currency:
          type: string
      required:
        - data
        - page
        - currency
    Entity:
      type: object
      properties:
        uuid:
          type: string
          description: >-
            Stable UUID of the entity. This is the sole public identifier; numeric ids are not accepted on any entity endpoint.
          example: 345d1ab6-33df-4759-9e17-0d0c0ec9ab1c
        type:
          type:
            - string
            - 'null'
          enum:
            - organization
            - person
            - null
          description: >-
            Top-level entity type — exactly one of `organization` or `person`. For organizations, `organization_subtype` carries the specific kind (company / university / gov_ngo / investor). Persons always have a null `organization_subtype`.
          example: organization
        organization_subtype:
          type:
            - string
            - 'null'
          enum:
            - company
            - university
            - gov_ngo
            - investor
            - null
          description: >-
            Organization subtype — one of `company`, `university`, `gov_ngo`, `investor`. Mutually exclusive. Set only when `type` is `organization`; always null for persons.
          example: company
        is_investor:
          type:
            - boolean
            - 'null'
          description: >-
            Stackable role flag — true when the entity makes investments. Independent of `type` / `organization_subtype`.
          example: false
        is_founder:
          type:
            - boolean
            - 'null'
          description: >-
            Stackable role flag — true when the person has a founder role. Person-level rollup; always false for organizations.
          example: false
        is_executive:
          type:
            - boolean
            - 'null'
          description: >-
            Stackable role flag — true when the person holds an executive role. Person-level rollup; always false for organizations.
          example: false
        is_partner:
          type:
            - boolean
            - 'null'
          description: >-
            Stackable role flag — true when the person holds a partner role (e.g. at an investment firm). Person-level rollup; always false for organizations.
          example: false
        total_invested:
          type:
            - number
            - 'null'
          description: >-
            Precomputed total amount this entity has invested across all rounds, in whole units of the active currency. Non-null only for entities that make investments (`is_investor = true`); null otherwise.
          example: 4200000000
        name:
          type: string
          description: Display name of the entity.
          example: Stripe
        tagline:
          type:
            - string
            - 'null'
          description: 'Short, one-line marketing description (≤ ~140 chars).'
          example: Online payment processing for internet businesses.
        about:
          type:
            - string
            - 'null'
          description: 'Long-form description / about text. Plain text, may span multiple sentences.'
          example: Stripe builds economic infrastructure for the internet…
        image:
          type:
            - string
            - 'null'
          description: 'Absolute URL to the entity''s logo image (PNG or JPEG, CDN-hosted).'
          example: 'https://images.dealroom.co/logos/stripe.png'
        dealroom_url:
          type:
            - string
            - 'null'
          description: Canonical URL on app.dealroom.co.
          example: 'https://app.dealroom.co/companies/stripe'
        closing_year:
          type:
            - number
            - 'null'
          description: Year the entity was closed/shut down (null when still active).
        employee_count:
          type:
            - number
            - 'null'
          description: Number of employees.
        employee_count_1y_growth:
          type:
            - number
            - 'null'
          description: Year-over-year employee count growth percentage.
        launch_year:
          type:
            - number
            - 'null'
          description: Year the entity was founded.
          example: 2010
        launch_month:
          type:
            - number
            - 'null'
          description: Month the entity was founded (1-12; null when unknown).
          example: 2
        hq_country:
          type:
            - string
            - 'null'
          description: Country name of the entity's HQ.
          example: United States
        hq_city:
          type:
            - string
            - 'null'
          description: City of the entity's HQ.
          example: San Francisco
        website:
          type:
            - string
            - 'null'
          description: Full website URL.
        website_domain:
          type:
            - string
            - 'null'
          description: Domain name only (e.g. "stripe.com").
        linkedin_url:
          type:
            - string
            - 'null'
          description: LinkedIn profile URL.
          example: 'https://www.linkedin.com/company/stripe'
        twitter_url:
          type:
            - string
            - 'null'
          description: Twitter/X profile URL.
          example: 'https://twitter.com/stripe'
        lat:
          type:
            - number
            - 'null'
          description: HQ latitude in decimal degrees.
          example: 37.7878
        lon:
          type:
            - number
            - 'null'
          description: HQ longitude in decimal degrees.
          example: -122.4032
        founding_country:
          type:
            - string
            - 'null'
          description: Country name where the entity was founded.
          example: United States
        founding_city:
          type:
            - string
            - 'null'
          description: City where the entity was founded.
          example: San Francisco
        founding_lat:
          type:
            - number
            - 'null'
          description: Founding location latitude in decimal degrees.
          example: 37.7878
        founding_lon:
          type:
            - number
            - 'null'
          description: Founding location longitude in decimal degrees.
          example: -122.4032
        company:
          type: object
          properties:
            is_unicorn:
              type:
                - boolean
                - 'null'
              description: True when the company has reached unicorn status (valued at $1B or more).
            is_vc_backed:
              type:
                - boolean
                - 'null'
              description: True when the company has raised venture capital funding.
            is_exited:
              type:
                - boolean
                - 'null'
              description: True when the company has had an exit (IPO or acquisition).
            is_pe_owned:
              type:
                - boolean
                - 'null'
              description: True when the company is owned by a private equity firm.
            is_hiring:
              type:
                - boolean
                - 'null'
              description: True when the company is currently hiring.
            has_founder:
              type:
                - boolean
                - 'null'
              description: True when at least one founder is recorded for the company.
            open_jobs_count:
              type: number
              description: Number of active job openings for the company (from the jobs table). 0 when none.
              example: 12
            company_status:
              type:
                - string
                - 'null'
              enum:
                - operational
                - acquired
                - closed
                - low_activity
                - null
              description: Current operational status of the company.
            signal_rating:
              type:
                - number
                - 'null'
              description: Dealroom Signal overall rating (0-100).
            similarweb_3_months_growth:
              type:
                - number
                - 'null'
              description: '% growth in traffic over trailing 3 months.'
            similarweb_traffic:
              type:
                - number
                - 'null'
              description: Monthly site visits estimate from SimilarWeb.
            total_funding:
              type:
                - number
                - 'null'
              description: Total amount raised in active currency.
            total_vc_funding:
              type:
                - number
                - 'null'
              description: 'Subset of total_funding: VC-only funding.'
            unicorn_type:
              type:
                - string
                - 'null'
              description: 'Sub-category of unicorn (e.g. "centaur", "decacorn").'
            year_became_unicorn:
              type:
                - number
                - 'null'
              description: Year the company reached unicorn status.
            year_of_exit:
              type:
                - number
                - 'null'
              description: Year the company exited (IPO or acquisition); null when not exited.
          required:
            - is_unicorn
            - is_vc_backed
            - is_exited
            - is_pe_owned
            - is_hiring
            - has_founder
            - open_jobs_count
            - company_status
            - signal_rating
            - similarweb_3_months_growth
            - similarweb_traffic
            - total_funding
            - total_vc_funding
            - unicorn_type
            - year_became_unicorn
            - year_of_exit
          description: >-
            Company-specific attributes. Present only when `organization_subtype = company`. `company_status` is one of `operational`, `acquired`, `closed`, `low_activity`.
        person:
          type: object
          properties:
            gender:
              type:
                - string
                - 'null'
              enum:
                - male
                - female
                - non_binary
                - prefer_not_to_say
                - null
              description: Gender of the person.
            is_serial_founder:
              type:
                - boolean
                - 'null'
              description: True when the person has founded more than one company.
            is_super_founder:
              type:
                - boolean
                - 'null'
              description: Dealroom's super-founder signal for the person.
            is_promising_founder:
              type:
                - boolean
                - 'null'
              description: Dealroom's promising-founder signal for the person.
            is_strong_founder:
              type:
                - boolean
                - 'null'
              description: Dealroom's strong-founder signal for the person.
            founded_companies_total_funding:
              type:
                - number
                - 'null'
              description: >-
                Combined funding raised across all companies this person founded, in the active currency.
          required:
            - gender
            - is_serial_founder
            - is_super_founder
            - is_promising_founder
            - is_strong_founder
            - founded_companies_total_funding
          description: Person-specific attributes. Present only when `type = person`.
        investor:
          type: object
          properties:
            total_investments_count:
              type:
                - number
                - 'null'
              description: Total number of investments this investor has made.
            preferred_round:
              type:
                - string
                - 'null'
              description: The investor's most frequent funding round stage (e.g. `series_a`).
            last_investor_round_year:
              type:
                - number
                - 'null'
              description: Year of the investor's most recent investment round.
            last_investor_round_month:
              type:
                - number
                - 'null'
              description: Month (1-12) of the investor's most recent investment round.
          required:
            - total_investments_count
            - preferred_round
            - last_investor_round_year
            - last_investor_round_month
          description: Investor-specific attributes. Present only when `is_investor = true`.
        university:
          type: object
          properties:
            alumni_count:
              type:
                - number
                - 'null'
              description: Total number of alumni recorded for the university.
            alumni_founder_count:
              type:
                - number
                - 'null'
              description: Number of alumni who are company founders.
            alumni_founded_companies_count:
              type:
                - number
                - 'null'
              description: Number of companies founded by the university's alumni.
            alumni_unicorn_companies_count:
              type:
                - number
                - 'null'
              description: Number of unicorn companies founded by the university's alumni.
            spinout_count:
              type:
                - number
                - 'null'
              description: Number of spinout companies originating from the university.
          required:
            - alumni_count
            - alumni_founder_count
            - alumni_founded_companies_count
            - alumni_unicorn_companies_count
            - spinout_count
          description: University-specific attributes. Present only when `organization_subtype = university`.
        funding_summary:
          type: object
          properties:
            total_funding:
              type:
                - number
                - 'null'
              description: >-
                Total amount raised across all rounds in the active currency, as a whole-unit integer.
              example: 9123000000
            round_count:
              type:
                - number
                - 'null'
              description: Number of distinct funding rounds recorded for this entity.
              example: 28
          required:
            - total_funding
            - round_count
          description: >-
            Aggregated funding totals for the entity. Present on companies that have at least one recorded funding round.
        tags:
          type: array
          items:
            type: object
            properties:
              id:
                type: number
                description: Numeric identifier of the tag.
              name:
                type: string
                description: Display name of the tag.
              type:
                type: string
                enum:
                  - sector
                  - technology
                  - industry
                  - sub_industry
                  - business_model
                  - income_stream
                  - client_focus
                  - sdg
                  - ownership
                  - techstack_category
                  - deal_structure
                  - growth_stage
                  - investor_type
                description: 'Category of the tag (e.g. industry, sector, technology).'
            required:
              - id
              - name
              - type
          description: 'Taxonomy tags associated with the entity (industries, sectors, technologies, etc.).'
        founders:
          type: array
          items:
            type: object
            properties:
              uuid:
                type: string
                description: Stable UUID of the founder.
                example: 1a2b3c4d-5e6f-7890-1234-567890abcdef
              name:
                type: string
                description: Display name of the founder.
              image:
                type:
                  - string
                  - 'null'
                description: Absolute URL to the founder's profile image; null when none.
              dealroom_url:
                type:
                  - string
                  - 'null'
                description: Canonical URL of the founder's profile on app.dealroom.co.
              is_investor:
                type:
                  - boolean
                  - 'null'
                description: >-
                  True when the founder is also an investor (links to investor profile instead of person).
              is_strong_founder:
                type:
                  - boolean
                  - 'null'
                description: >-
                  Dealroom's strong-founder signal. Strong founders sort first in this array, so callers surfacing one representative founder pick the one that satisfies a founder.is_strong_founder filter.
            required:
              - uuid
              - name
              - image
              - dealroom_url
              - is_investor
              - is_strong_founder
          description: Founders associated with the entity; strong founders sorted first.
        latest_valuation:
          type:
            - object
            - 'null'
          properties:
            value:
              type:
                - number
                - 'null'
              description: Valuation amount in the active currency; null when unknown.
            year:
              type:
                - number
                - 'null'
              description: Year the valuation was recorded.
            month:
              type:
                - number
                - 'null'
              description: Month the valuation was recorded (1-12; null when unknown).
          required:
            - value
            - year
            - month
          description: 'Most recent valuation recorded for the entity, with the period it applies to.'
        latest_revenue:
          type:
            - object
            - 'null'
          properties:
            value:
              type:
                - number
                - 'null'
              description: Revenue amount in the active currency; null when unknown.
            year:
              type:
                - number
                - 'null'
              description: Year the revenue was recorded.
          required:
            - value
            - year
          description: 'Most recent revenue figure recorded for the entity, with the year it applies to.'
        added_at:
          type:
            - string
            - 'null'
          description: >-
            ISO 8601 timestamp when this entity was created in Dealroom's source system ("added to Dealroom"). Distinct from created_at (data-loader sync time). Sort with `-added_at` for a newest-added-first feed.
          example: '2026-06-30T04:00:52.000Z'
        created_at:
          type:
            - string
            - 'null'
          description: ISO 8601 timestamp when this record was first loaded
          example: '2026-03-21T08:00:00.000Z'
        updated_at:
          type:
            - string
            - 'null'
          description: ISO 8601 timestamp when this record was last modified
          example: '2026-03-27T10:30:00.000Z'
        deleted_at:
          type:
            - string
            - 'null'
          description: ISO 8601 timestamp when this record was soft-deleted (null = active)
          example: null
      required:
        - uuid
        - type
        - organization_subtype
        - is_investor
        - is_founder
        - is_executive
        - is_partner
        - total_invested
        - name
        - tagline
        - about
        - image
        - dealroom_url
        - closing_year
        - employee_count
        - employee_count_1y_growth
        - launch_year
        - launch_month
        - hq_country
        - hq_city
        - website
        - website_domain
        - linkedin_url
        - twitter_url
        - lat
        - lon
        - founding_country
        - founding_city
        - founding_lat
        - founding_lon
        - latest_valuation
        - latest_revenue
        - added_at
        - created_at
        - updated_at
        - deleted_at
    ErrorResponse:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
              enum:
                - VALIDATION_ERROR
                - NOT_FOUND
                - UNAUTHORIZED
                - DATABASE_ERROR
                - UNKNOWN_FILTER
                - FILTER_VALIDATION_ERROR
                - UNSUPPORTED_OPERATOR
                - FILTER_PARSE_ERROR
                - QUERY_TIMEOUT
                - INTERNAL_SERVER_ERROR
                - INVALID_ENTITY_ID
                - PAGINATION_DEPTH_EXCEEDED
                - SCHEMA_ERROR
                - FORBIDDEN
                - EXTERNAL_SERVICE_ERROR
                - ACCOUNT_REQUIRED
                - SERVICE_UNAVAILABLE
                - RATE_LIMITED
                - LIST_LOCKED
                - PATH_RENAMED
                - ENDPOINT_REMOVED
              description: Stable machine-readable error code.
            message:
              type: string
            details:
              anyOf:
                - type: array
                  items:
                    type: object
                    properties:
                      path:
                        type: string
                      message:
                        type: string
                    required:
                      - path
                      - message
                - type: object
                  additionalProperties:
                    anyOf:
                      - type: string
                      - type: number
                      - type: boolean
          required:
            - code
            - message
      required:
        - error
    GeoPointListResponse:
      type: object
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/GeoPoint'
        page:
          type: object
          properties:
            total:
              type: number
            limit:
              type: number
            offset:
              type: number
            next_cursor:
              type:
                - string
                - 'null'
              description: Opaque cursor for the next page. Null when no further pages exist.
            prev_cursor:
              type:
                - string
                - 'null'
              description: Opaque cursor for the previous page. Null when on the first page.
            capped:
              type: boolean
              description: True when the requested page size was reduced to the per-tier/ecosystem row cap.
            tier:
              type: string
              enum:
                - anonymous
                - free
                - premium
              description: 'The access tier applied to this request (anonymous, free, premium).'
            ecosystem:
              type:
                - string
                - 'null'
              description: 'Slug of the active ecosystem subdomain, or null when none is in scope.'
          required:
            - limit
            - offset
            - next_cursor
            - prev_cursor
      required:
        - data
        - page
    GeoPoint:
      type: object
      properties:
        uuid:
          type: string
        name:
          type: string
        lat:
          type:
            - number
            - 'null'
        lon:
          type:
            - number
            - 'null'
        hq_country:
          type:
            - string
            - 'null'
        hq_city:
          type:
            - string
            - 'null'
      required:
        - uuid
        - name
        - lat
        - lon
        - hq_country
        - hq_city
    EntityDetailResponse:
      type: object
      properties:
        data:
          $ref: '#/components/schemas/Entity'
        currency:
          type: string
      required:
        - data
        - currency
    EntityLpFundsResponse:
      type: object
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/EntityLpFundItem'
        page:
          type: object
          properties:
            total:
              type: number
            limit:
              type: number
            offset:
              type: number
            next_cursor:
              type:
                - string
                - 'null'
              description: Opaque cursor for the next page. Null when no further pages exist.
            prev_cursor:
              type:
                - string
                - 'null'
              description: Opaque cursor for the previous page. Null when on the first page.
            capped:
              type: boolean
              description: True when the requested page size was reduced to the per-tier/ecosystem row cap.
            tier:
              type: string
              enum:
                - anonymous
                - free
                - premium
              description: 'The access tier applied to this request (anonymous, free, premium).'
            ecosystem:
              type:
                - string
                - 'null'
              description: 'Slug of the active ecosystem subdomain, or null when none is in scope.'
          required:
            - limit
            - offset
            - next_cursor
            - prev_cursor
      required:
        - data
        - page
    EntityLpFundItem:
      type: object
      properties:
        uuid:
          type: string
          description: Stable UUID of the investor entity.
          example: 345d1ab6-33df-4759-9e17-0d0c0ec9ab1c
        name:
          type:
            - string
            - 'null'
          example: Oxford Science Enterprises
        image:
          type:
            - string
            - 'null'
          description: 'Logo host/path, prefix with `https://` to render.'
        tagline:
          type:
            - string
            - 'null'
          example: Early-stage deep tech and life sciences fund.
        type:
          type: string
          enum:
            - organization
            - person
          description: Entity type of the investor (always `organization` in practice).
          example: organization
        organization_subtype:
          type:
            - string
            - 'null'
          enum:
            - company
            - university
            - gov_ngo
            - investor
            - null
          description: >-
            Organization subtype; `investor` for the vast majority of rows. Use this to link to the correct profile route.
          example: investor
        investor_types:
          type: array
          items:
            type: string
          description: >-
            Investor type names (e.g. `Venture Capital`, `Accelerator`). The upstream taxonomy folds incubators into `Accelerator`, so there is no separate incubator type.
          example:
            - Venture Capital
        launch_year:
          type:
            - number
            - 'null'
          example: 2015
        hq_city:
          type:
            - string
            - 'null'
          example: Oxford
        hq_country:
          type:
            - string
            - 'null'
          example: United Kingdom
      required:
        - uuid
        - name
        - image
        - tagline
        - type
        - organization_subtype
        - investor_types
        - launch_year
        - hq_city
        - hq_country
    CompanyListResponse:
      type: object
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/Entity'
        page:
          type: object
          properties:
            total:
              type: number
            limit:
              type: number
            offset:
              type: number
            next_cursor:
              type:
                - string
                - 'null'
              description: Opaque cursor for the next page. Null when no further pages exist.
            prev_cursor:
              type:
                - string
                - 'null'
              description: Opaque cursor for the previous page. Null when on the first page.
            capped:
              type: boolean
              description: True when the requested page size was reduced to the per-tier/ecosystem row cap.
            tier:
              type: string
              enum:
                - anonymous
                - free
                - premium
              description: 'The access tier applied to this request (anonymous, free, premium).'
            ecosystem:
              type:
                - string
                - 'null'
              description: 'Slug of the active ecosystem subdomain, or null when none is in scope.'
          required:
            - limit
            - offset
            - next_cursor
            - prev_cursor
        currency:
          type: string
      required:
        - data
        - page
        - currency
    CompanyGeoResponse:
      type: object
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/CompanyGeoPoint'
        page:
          type: object
          properties:
            total:
              type: number
            limit:
              type: number
            offset:
              type: number
            next_cursor:
              type:
                - string
                - 'null'
              description: Opaque cursor for the next page. Null when no further pages exist.
            prev_cursor:
              type:
                - string
                - 'null'
              description: Opaque cursor for the previous page. Null when on the first page.
            capped:
              type: boolean
              description: True when the requested page size was reduced to the per-tier/ecosystem row cap.
            tier:
              type: string
              enum:
                - anonymous
                - free
                - premium
              description: 'The access tier applied to this request (anonymous, free, premium).'
            ecosystem:
              type:
                - string
                - 'null'
              description: 'Slug of the active ecosystem subdomain, or null when none is in scope.'
          required:
            - limit
            - offset
            - next_cursor
            - prev_cursor
      required:
        - data
        - page
    CompanyGeoPoint:
      type: object
      properties:
        id:
          type: string
          description: Stable UUID of the company
          example: 345d1ab6-33df-4759-9e17-0d0c0ec9ab1c
        name:
          type:
            - string
            - 'null'
        lat:
          type: number
          description: HQ latitude (WGS84)
        lon:
          type: number
          description: HQ longitude (WGS84)
        logo:
          type:
            - string
            - 'null'
          description: >-
            Logo/avatar image URL for the company (powers the map's logo layer); null when the entity has no image. May be a bare host/path or a full URL.
        value:
          type:
            - number
            - 'null'
          description: >-
            The `size_by` dimension's value for this company (USD for monetary dimensions); null when there is no value or no `size_by` was requested
      required:
        - id
        - name
        - lat
        - lon
        - logo
        - value
    CompanyDetailResponse:
      type: object
      properties:
        data:
          $ref: '#/components/schemas/Entity'
        currency:
          type: string
      required:
        - data
        - currency
    EntityTransactionsResponse:
      type: object
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/EntityTransactionItem'
        page:
          type: object
          properties:
            total:
              type: number
            limit:
              type: number
            offset:
              type: number
            next_cursor:
              type:
                - string
                - 'null'
              description: Opaque cursor for the next page. Null when no further pages exist.
            prev_cursor:
              type:
                - string
                - 'null'
              description: Opaque cursor for the previous page. Null when on the first page.
            capped:
              type: boolean
              description: True when the requested page size was reduced to the per-tier/ecosystem row cap.
            tier:
              type: string
              enum:
                - anonymous
                - free
                - premium
              description: 'The access tier applied to this request (anonymous, free, premium).'
            ecosystem:
              type:
                - string
                - 'null'
              description: 'Slug of the active ecosystem subdomain, or null when none is in scope.'
          required:
            - limit
            - offset
            - next_cursor
            - prev_cursor
        currency:
          type: string
      required:
        - data
        - page
        - currency
    EntityTransactionItem:
      type: object
      properties:
        id:
          type: number
        amount:
          type:
            - number
            - 'null'
        year:
          type:
            - number
            - 'null'
        month:
          type:
            - number
            - 'null'
        round_type:
          type:
            - string
            - 'null'
        standardized_round:
          type:
            - string
            - 'null'
          enum:
            - Pre-Seed
            - Seed
            - Series A
            - Series B
            - Series C
            - Series D
            - Series E
            - Series F+
            - Growth
            - Bridge
            - Debt
            - Grant
            - IPO
            - Secondary
            - Other
            - null
        valuation:
          type:
            - number
            - 'null'
        is_verified:
          type:
            - boolean
            - 'null'
        is_vc_round:
          type:
            - boolean
            - 'null'
        is_exit:
          type:
            - boolean
            - 'null'
        investors:
          type: array
          items:
            type: object
            properties:
              uuid:
                type: string
                description: UUID of the participating investor.
                example: 345d1ab6-33df-4759-9e17-0d0c0ec9ab1c
              name:
                type: string
                description: Display name of the participating investor.
                example: Index Ventures
              is_lead:
                type:
                  - boolean
                  - 'null'
                description: 'Whether this investor led the round, when known.'
                example: true
              type:
                type: string
                enum:
                  - organization
                  - person
                description: Entity type of the participant (`organization` or `person`).
                example: organization
              organization_subtype:
                type:
                  - string
                  - 'null'
                enum:
                  - company
                  - university
                  - gov_ngo
                  - investor
                  - null
                description: >-
                  Organization subtype when `type` is `organization`; null for person participants (e.g. angel investors). Use with `type` to link to the correct profile.
                example: investor
              image:
                type:
                  - string
                  - 'null'
                description: Investor logo URL; null when the entity has no image.
                example: 'https://storage.googleapis.com/dealroom-images-production/…/logo.png'
            required:
              - uuid
              - name
              - is_lead
              - type
              - organization_subtype
              - image
        source_url:
          type:
            - string
            - 'null'
      required:
        - id
        - amount
        - year
        - month
        - round_type
        - standardized_round
        - valuation
        - is_verified
        - is_vc_round
        - is_exit
        - investors
        - source_url
    EntityValuationsResponse:
      type: object
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/EntityValuationItem'
        page:
          type: object
          properties:
            total:
              type: number
            limit:
              type: number
            offset:
              type: number
            next_cursor:
              type:
                - string
                - 'null'
              description: Opaque cursor for the next page. Null when no further pages exist.
            prev_cursor:
              type:
                - string
                - 'null'
              description: Opaque cursor for the previous page. Null when on the first page.
            capped:
              type: boolean
              description: True when the requested page size was reduced to the per-tier/ecosystem row cap.
            tier:
              type: string
              enum:
                - anonymous
                - free
                - premium
              description: 'The access tier applied to this request (anonymous, free, premium).'
            ecosystem:
              type:
                - string
                - 'null'
              description: 'Slug of the active ecosystem subdomain, or null when none is in scope.'
          required:
            - limit
            - offset
            - next_cursor
            - prev_cursor
        currency:
          type: string
      required:
        - data
        - page
        - currency
    EntityValuationItem:
      type: object
      properties:
        id:
          type: number
        value:
          type:
            - number
            - 'null'
        year:
          type:
            - number
            - 'null'
        month:
          type:
            - number
            - 'null'
        is_estimate:
          type:
            - boolean
            - 'null'
      required:
        - id
        - value
        - year
        - month
        - is_estimate
    EntityInvestorsResponse:
      type: object
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/EntityInvestorItem'
        page:
          type: object
          properties:
            total:
              type: number
            limit:
              type: number
            offset:
              type: number
            next_cursor:
              type:
                - string
                - 'null'
              description: Opaque cursor for the next page. Null when no further pages exist.
            prev_cursor:
              type:
                - string
                - 'null'
              description: Opaque cursor for the previous page. Null when on the first page.
            capped:
              type: boolean
              description: True when the requested page size was reduced to the per-tier/ecosystem row cap.
            tier:
              type: string
              enum:
                - anonymous
                - free
                - premium
              description: 'The access tier applied to this request (anonymous, free, premium).'
            ecosystem:
              type:
                - string
                - 'null'
              description: 'Slug of the active ecosystem subdomain, or null when none is in scope.'
          required:
            - limit
            - offset
            - next_cursor
            - prev_cursor
      required:
        - data
        - page
    EntityInvestorItem:
      type: object
      properties:
        uuid:
          type: string
          description: Stable UUID of the investor entity.
          example: 345d1ab6-33df-4759-9e17-0d0c0ec9ab1c
        name:
          type:
            - string
            - 'null'
          example: Index Ventures
        image:
          type:
            - string
            - 'null'
          description: 'Logo host/path, prefix with `https://` to render.'
        type:
          type: string
          enum:
            - organization
            - person
          description: Entity type of the investor (`organization` or `person`).
          example: organization
        organization_subtype:
          type:
            - string
            - 'null'
          enum:
            - company
            - university
            - gov_ngo
            - investor
            - null
          description: >-
            Organization subtype (`company`, `investor`, …); null for person investors. Use this to link to the correct profile route.
          example: investor
        is_investor:
          type: boolean
          description: Whether the investor is flagged as an investor entity.
        is_lead:
          type: boolean
          description: True when this investor led at least one of the company's rounds.
        rounds_count:
          type: number
          description: >-
            Number of the company's funding rounds this investor joined. 0 means the investment is confirmed but not attributed to any disclosed round (an "additional investor").
          example: 3
        last_round_year:
          type:
            - number
            - 'null'
          description: >-
            Year of the most recent round this investor participated in; null when the investment is not attributed to a round.
          example: 2024
      required:
        - uuid
        - name
        - image
        - type
        - organization_subtype
        - is_investor
        - is_lead
        - rounds_count
        - last_round_year
    EntityFinancialsResponse:
      type: object
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/FinancialYear'
        currency:
          type: string
      required:
        - data
        - currency
    FinancialYear:
      type: object
      properties:
        year:
          type: number
        revenue:
          type:
            - number
            - 'null'
        ebitda:
          type:
            - number
            - 'null'
        profit:
          type:
            - number
            - 'null'
        rnd:
          type:
            - number
            - 'null'
        valuation:
          type:
            - number
            - 'null'
        employees:
          type:
            - number
            - 'null'
      required:
        - year
        - revenue
        - ebitda
        - profit
        - rnd
        - valuation
        - employees
    EntityWebTrafficResponse:
      type: object
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/WebTrafficPoint'
      required:
        - data
    WebTrafficPoint:
      type: object
      properties:
        year:
          type: number
          example: 2025
        month:
          type: number
          description: Calendar month (1–12).
          example: 6
        visits:
          type: number
          description: Estimated web visits for the month (SimilarWeb-derived).
          example: 1250000
      required:
        - year
        - month
        - visits
    EntityHeadcountBreakdownResponse:
      type: object
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/HeadcountBreakdownPoint'
      required:
        - data
    HeadcountBreakdownPoint:
      type: object
      properties:
        breakdown_type:
          type: string
          enum:
            - country
            - department
          description: >-
            Which breakdown this row belongs to — `country` (employee distribution by country) or `department`.
          example: country
        item_id:
          type: number
          description: Country or department id.
          example: 233
        item_name:
          type:
            - string
            - 'null'
          description: Display label for the country or department.
          example: United States
        year:
          type: number
          example: 2025
        month:
          type: number
          description: Calendar month (1–12).
          example: 6
        percentage:
          type:
            - number
            - 'null'
          description: >-
            This item's share of headcount for the period (0–100). Null when the upstream value was NaN/Infinity.
          example: 42.5
      required:
        - breakdown_type
        - item_id
        - item_name
        - year
        - month
        - percentage
    EntityTeamResponse:
      type: object
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/EntityTeamMemberItem'
        page:
          type: object
          properties:
            total:
              type: number
            limit:
              type: number
            offset:
              type: number
            next_cursor:
              type:
                - string
                - 'null'
              description: Opaque cursor for the next page. Null when no further pages exist.
            prev_cursor:
              type:
                - string
                - 'null'
              description: Opaque cursor for the previous page. Null when on the first page.
            capped:
              type: boolean
              description: True when the requested page size was reduced to the per-tier/ecosystem row cap.
            tier:
              type: string
              enum:
                - anonymous
                - free
                - premium
              description: 'The access tier applied to this request (anonymous, free, premium).'
            ecosystem:
              type:
                - string
                - 'null'
              description: 'Slug of the active ecosystem subdomain, or null when none is in scope.'
          required:
            - limit
            - offset
            - next_cursor
            - prev_cursor
      required:
        - data
        - page
    EntityTeamMemberItem:
      type: object
      properties:
        uuid:
          type: string
          description: Stable UUID of the person.
          example: 1a2b3c4d-5e6f-7890-1234-567890abcdef
        name:
          type: string
          example: Patrick Collison
        tagline:
          type:
            - string
            - 'null'
          description: Short biographic line.
          example: Co-founder and CEO of Stripe.
        image:
          type:
            - string
            - 'null'
          description: Profile photo URL.
        dealroom_url:
          type:
            - string
            - 'null'
          description: Canonical URL on app.dealroom.co.
        gender:
          type:
            - string
            - 'null'
          example: male
        hq_country:
          type:
            - string
            - 'null'
          example: United States
        hq_city:
          type:
            - string
            - 'null'
          example: San Francisco
        is_founder:
          type:
            - boolean
            - 'null'
          description: True when this person is a founder at this entity.
        is_executive:
          type:
            - boolean
            - 'null'
          description: True when this person holds an executive role at this entity.
        is_partner:
          type:
            - boolean
            - 'null'
          description: True when this person holds a partner role at this entity.
        is_past:
          type:
            - boolean
            - 'null'
          description: >-
            True only when every recorded stint at this entity has ended (former member). False while any role is current.
        raw_title:
          type:
            - string
            - 'null'
          description: Representative raw title from the source data.
          example: Co-founder & CEO
        titles:
          type: array
          items:
            type: string
          description: Normalised job titles held at this entity.
          example:
            - CEO
            - Co-Founder
        year_start:
          type:
            - number
            - 'null'
          description: Earliest recorded start year at this entity.
          example: 2010
        year_end:
          type:
            - number
            - 'null'
          description: Latest recorded end year at this entity (null when current).
          example: null
      required:
        - uuid
        - name
        - tagline
        - image
        - dealroom_url
        - gender
        - hq_country
        - hq_city
        - is_founder
        - is_executive
        - is_partner
        - is_past
        - raw_title
        - titles
        - year_start
        - year_end
    UniversityListResponse:
      type: object
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/Entity'
        page:
          type: object
          properties:
            total:
              type: number
            limit:
              type: number
            offset:
              type: number
            next_cursor:
              type:
                - string
                - 'null'
              description: Opaque cursor for the next page. Null when no further pages exist.
            prev_cursor:
              type:
                - string
                - 'null'
              description: Opaque cursor for the previous page. Null when on the first page.
            capped:
              type: boolean
              description: True when the requested page size was reduced to the per-tier/ecosystem row cap.
            tier:
              type: string
              enum:
                - anonymous
                - free
                - premium
              description: 'The access tier applied to this request (anonymous, free, premium).'
            ecosystem:
              type:
                - string
                - 'null'
              description: 'Slug of the active ecosystem subdomain, or null when none is in scope.'
          required:
            - limit
            - offset
            - next_cursor
            - prev_cursor
        currency:
          type: string
      required:
        - data
        - page
        - currency
    UniversityGeoResponse:
      type: object
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/UniversityGeoPoint'
        page:
          type: object
          properties:
            total:
              type: number
            limit:
              type: number
            offset:
              type: number
            next_cursor:
              type:
                - string
                - 'null'
              description: Opaque cursor for the next page. Null when no further pages exist.
            prev_cursor:
              type:
                - string
                - 'null'
              description: Opaque cursor for the previous page. Null when on the first page.
            capped:
              type: boolean
              description: True when the requested page size was reduced to the per-tier/ecosystem row cap.
            tier:
              type: string
              enum:
                - anonymous
                - free
                - premium
              description: 'The access tier applied to this request (anonymous, free, premium).'
            ecosystem:
              type:
                - string
                - 'null'
              description: 'Slug of the active ecosystem subdomain, or null when none is in scope.'
          required:
            - limit
            - offset
            - next_cursor
            - prev_cursor
      required:
        - data
        - page
    UniversityGeoPoint:
      type: object
      properties:
        id:
          type: string
          description: Stable UUID of the university
          example: c7f4a2b9-1e6d-4c3a-8b5f-2a9d7e4c6b1f
        name:
          type:
            - string
            - 'null'
        lat:
          type: number
          description: HQ latitude (WGS84)
        lon:
          type: number
          description: HQ longitude (WGS84)
        logo:
          type:
            - string
            - 'null'
          description: >-
            Logo/avatar image URL for the university (powers the map's logo layer); null when the entity has no image. May be a bare host/path or a full URL.
        value:
          type:
            - number
            - 'null'
          description: >-
            The `size_by` dimension's value for this university (USD for monetary dimensions); null when there is no value or no `size_by` was requested
      required:
        - id
        - name
        - lat
        - lon
        - logo
        - value
    UniversityDetailResponse:
      type: object
      properties:
        data:
          $ref: '#/components/schemas/Entity'
        currency:
          type: string
      required:
        - data
        - currency
    UniversityAlumniResponse:
      type: object
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/UniversityAlumniItem'
        page:
          type: object
          properties:
            total:
              type: number
            limit:
              type: number
            offset:
              type: number
            next_cursor:
              type:
                - string
                - 'null'
              description: Opaque cursor for the next page. Null when no further pages exist.
            prev_cursor:
              type:
                - string
                - 'null'
              description: Opaque cursor for the previous page. Null when on the first page.
            capped:
              type: boolean
              description: True when the requested page size was reduced to the per-tier/ecosystem row cap.
            tier:
              type: string
              enum:
                - anonymous
                - free
                - premium
              description: 'The access tier applied to this request (anonymous, free, premium).'
            ecosystem:
              type:
                - string
                - 'null'
              description: 'Slug of the active ecosystem subdomain, or null when none is in scope.'
          required:
            - limit
            - offset
            - next_cursor
            - prev_cursor
      required:
        - data
        - page
    UniversityAlumniItem:
      type: object
      properties:
        uuid:
          type: string
          description: Stable UUID of the person.
        name:
          type: string
          example: Patrick Collison
        tagline:
          type:
            - string
            - 'null'
          description: Short biographic line.
        image:
          type:
            - string
            - 'null'
          description: Profile photo URL.
        dealroom_url:
          type:
            - string
            - 'null'
          description: Canonical URL on app.dealroom.co.
        gender:
          type:
            - string
            - 'null'
          example: male
        hq_city:
          type:
            - string
            - 'null'
          example: San Francisco
        hq_country:
          type:
            - string
            - 'null'
          example: United States
        is_founder:
          type:
            - boolean
            - 'null'
          description: >-
            True when this alum is flagged as a founder (person-level rollup) — use to surface founder alumni.
        degrees:
          type: array
          items:
            type: string
          description: Degree name(s) earned at this university.
          example:
            - Bachelor
        year_start:
          type:
            - number
            - 'null'
          description: Earliest recorded study start year here.
          example: 2006
        year_end:
          type:
            - number
            - 'null'
          description: Latest recorded study end year here.
          example: 2009
      required:
        - uuid
        - name
        - tagline
        - image
        - dealroom_url
        - gender
        - hq_city
        - hq_country
        - is_founder
        - degrees
        - year_start
        - year_end
    GovNgoListResponse:
      type: object
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/Entity'
        page:
          type: object
          properties:
            total:
              type: number
            limit:
              type: number
            offset:
              type: number
            next_cursor:
              type:
                - string
                - 'null'
              description: Opaque cursor for the next page. Null when no further pages exist.
            prev_cursor:
              type:
                - string
                - 'null'
              description: Opaque cursor for the previous page. Null when on the first page.
            capped:
              type: boolean
              description: True when the requested page size was reduced to the per-tier/ecosystem row cap.
            tier:
              type: string
              enum:
                - anonymous
                - free
                - premium
              description: 'The access tier applied to this request (anonymous, free, premium).'
            ecosystem:
              type:
                - string
                - 'null'
              description: 'Slug of the active ecosystem subdomain, or null when none is in scope.'
          required:
            - limit
            - offset
            - next_cursor
            - prev_cursor
        currency:
          type: string
      required:
        - data
        - page
        - currency
    GovNgoGeoResponse:
      type: object
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/GovNgoGeoPoint'
        page:
          type: object
          properties:
            total:
              type: number
            limit:
              type: number
            offset:
              type: number
            next_cursor:
              type:
                - string
                - 'null'
              description: Opaque cursor for the next page. Null when no further pages exist.
            prev_cursor:
              type:
                - string
                - 'null'
              description: Opaque cursor for the previous page. Null when on the first page.
            capped:
              type: boolean
              description: True when the requested page size was reduced to the per-tier/ecosystem row cap.
            tier:
              type: string
              enum:
                - anonymous
                - free
                - premium
              description: 'The access tier applied to this request (anonymous, free, premium).'
            ecosystem:
              type:
                - string
                - 'null'
              description: 'Slug of the active ecosystem subdomain, or null when none is in scope.'
          required:
            - limit
            - offset
            - next_cursor
            - prev_cursor
      required:
        - data
        - page
    GovNgoGeoPoint:
      type: object
      properties:
        id:
          type: string
          description: Stable UUID of the government/NGO entity
          example: 8d2f6b4a-9c1e-4f7d-b3a5-6e0c8d2f4a7b
        name:
          type:
            - string
            - 'null'
        lat:
          type: number
          description: HQ latitude (WGS84)
        lon:
          type: number
          description: HQ longitude (WGS84)
        logo:
          type:
            - string
            - 'null'
          description: >-
            Logo/avatar image URL for the government/NGO entity (powers the map's logo layer); null when the entity has no image. May be a bare host/path or a full URL.
        value:
          type:
            - number
            - 'null'
          description: >-
            The `size_by` dimension's value for this government/NGO entity (USD for monetary dimensions); null when there is no value or no `size_by` was requested
      required:
        - id
        - name
        - lat
        - lon
        - logo
        - value
    GovNgoDetailResponse:
      type: object
      properties:
        data:
          $ref: '#/components/schemas/Entity'
        currency:
          type: string
      required:
        - data
        - currency
    TransactionListResponse:
      type: object
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/Transaction'
        page:
          type: object
          properties:
            total:
              type: number
            limit:
              type: number
            offset:
              type: number
            next_cursor:
              type:
                - string
                - 'null'
              description: Opaque cursor for the next page. Null when no further pages exist.
            prev_cursor:
              type:
                - string
                - 'null'
              description: Opaque cursor for the previous page. Null when on the first page.
            capped:
              type: boolean
              description: True when the requested page size was reduced to the per-tier/ecosystem row cap.
            tier:
              type: string
              enum:
                - anonymous
                - free
                - premium
              description: 'The access tier applied to this request (anonymous, free, premium).'
            ecosystem:
              type:
                - string
                - 'null'
              description: 'Slug of the active ecosystem subdomain, or null when none is in scope.'
          required:
            - limit
            - offset
            - next_cursor
            - prev_cursor
        currency:
          type: string
      required:
        - data
        - page
        - currency
    Transaction:
      type: object
      properties:
        id:
          type: number
          description: Stable Dealroom transaction ID.
          example: 12345
        entity_uuid:
          type: string
          description: UUID of the company that received this transaction.
          example: 345d1ab6-33df-4759-9e17-0d0c0ec9ab1c
        amount:
          type:
            - number
            - 'null'
          description: 'Round amount in the active currency, as a whole-unit integer.'
          example: 5000000
        year:
          type:
            - number
            - 'null'
          description: Year the round was announced.
          example: 2024
        month:
          type:
            - number
            - 'null'
          description: Month (1-12) the round was announced. May be null.
          example: 3
        round_type:
          type:
            - string
            - 'null'
          description: >-
            Raw reported round type (e.g. `SEED`, `SERIES A`, `EARLY VC`, `GRANT`). For the normalised stage, use `standardized_round`. See the [Filters reference](/references/filters-and-sorting) for the complete enum.
          example: SERIES B
        standardized_round:
          type:
            - string
            - 'null'
          enum:
            - Pre-Seed
            - Seed
            - Series A
            - Series B
            - Series C
            - Series D
            - Series E
            - Series F+
            - Growth
            - Bridge
            - Debt
            - Grant
            - IPO
            - Secondary
            - Other
            - null
          description: >-
            Normalised round stage — one of `Pre-Seed`, `Seed`, `Series A`–`Series E`, `Series F+`, `Growth`, `Bridge`, `Debt`, `Grant`, `IPO`, `Secondary`, `Other`. This is the value the `standardized_round` filter matches.
          example: Series B
        valuation:
          type:
            - number
            - 'null'
          description: >-
            Post-money valuation in the active currency at the time of this round, as a whole-unit integer. Null when the valuation was not disclosed.
          example: 5000000000
        is_verified:
          type:
            - boolean
            - 'null'
          description: Whether the round has been verified by Dealroom.
          example: true
        is_vc_round:
          type:
            - boolean
            - 'null'
          description: Whether the round is a venture-capital round.
          example: true
        is_exit:
          type:
            - boolean
            - 'null'
          description: 'Whether the transaction represents an exit (e.g. IPO, acquisition).'
          example: false
        company:
          type: object
          properties:
            uuid:
              type: string
              description: Stable UUID of the company that received the round.
              example: 345d1ab6-33df-4759-9e17-0d0c0ec9ab1c
            name:
              type:
                - string
                - 'null'
              description: Company name.
              example: Index Ventures
            image:
              type:
                - string
                - 'null'
              description: Company logo URL; null when the company has no image.
            hq_country:
              type:
                - string
                - 'null'
              description: Headquarters country name.
              example: United Kingdom
            hq_city:
              type:
                - string
                - 'null'
              description: Headquarters city name.
              example: London
            tagline:
              type:
                - string
                - 'null'
              description: Short one-line description of the company.
            status:
              type:
                - string
                - 'null'
              enum:
                - operational
                - acquired
                - closed
                - low_activity
                - null
              description: >-
                `company_status` is one of `operational`, `acquired`, `closed`, `low_activity`, or `null` when unknown.
            total_funding:
              type:
                - number
                - 'null'
              description: 'Company''s all-time total funding raised, in the response `currency`.'
            latest_valuation:
              type:
                - object
                - 'null'
              properties:
                value:
                  type:
                    - number
                    - 'null'
                  description: Valuation amount in the active currency; null when unknown.
                year:
                  type:
                    - number
                    - 'null'
                  description: Year the valuation was recorded.
                month:
                  type:
                    - number
                    - 'null'
                  description: Month the valuation was recorded (1-12; null when unknown).
              required:
                - value
                - year
                - month
              description: >-
                Company's most recent known valuation (`value` in the response `currency`) and the period it was recorded. `null` for callers without the premium tier.
          required:
            - uuid
            - name
            - image
            - hq_country
            - hq_city
            - tagline
            - status
            - total_funding
            - latest_valuation
          description: >-
            Compact summary of the company that received the round — sufficient for table cells without a second round-trip to `/data/entities/{uuid}`.
        investors:
          type: array
          items:
            type: object
            properties:
              uuid:
                type: string
                description: UUID of the participating investor.
                example: 345d1ab6-33df-4759-9e17-0d0c0ec9ab1c
              name:
                type: string
                description: Display name of the participating investor.
                example: Index Ventures
              is_lead:
                type:
                  - boolean
                  - 'null'
                description: 'Whether this investor led the round, when known.'
                example: true
              type:
                type: string
                enum:
                  - organization
                  - person
                description: Entity type of the participant (`organization` or `person`).
                example: organization
              organization_subtype:
                type:
                  - string
                  - 'null'
                enum:
                  - company
                  - university
                  - gov_ngo
                  - investor
                  - null
                description: >-
                  Organization subtype when `type` is `organization`; null for person participants (e.g. angel investors). Use with `type` to link to the correct profile.
                example: investor
              image:
                type:
                  - string
                  - 'null'
                description: Investor logo URL; null when the entity has no image.
                example: 'https://storage.googleapis.com/dealroom-images-production/…/logo.png'
            required:
              - uuid
              - name
              - is_lead
              - type
              - organization_subtype
              - image
          description: Participating investors. The `is_lead` flag identifies the lead investor(s) when known.
        source_url:
          type:
            - string
            - 'null'
          description: >-
            URL of the news article or press release that is the source for this round. Null when no source is recorded.
          example: 'https://techcrunch.com/2024/03/21/acme-raises-series-b'
        created_at:
          type:
            - string
            - 'null'
          description: ISO 8601 timestamp when this record was first loaded
          example: '2026-03-21T08:00:00.000Z'
        deleted_at:
          type:
            - string
            - 'null'
          description: ISO 8601 timestamp when this record was soft-deleted (null = active)
          example: null
      required:
        - id
        - entity_uuid
        - amount
        - year
        - month
        - round_type
        - standardized_round
        - valuation
        - is_verified
        - is_vc_round
        - is_exit
        - investors
        - source_url
        - created_at
        - deleted_at
    ValuationListResponse:
      type: object
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/Valuation'
        page:
          type: object
          properties:
            total:
              type: number
            limit:
              type: number
            offset:
              type: number
            next_cursor:
              type:
                - string
                - 'null'
              description: Opaque cursor for the next page. Null when no further pages exist.
            prev_cursor:
              type:
                - string
                - 'null'
              description: Opaque cursor for the previous page. Null when on the first page.
            capped:
              type: boolean
              description: True when the requested page size was reduced to the per-tier/ecosystem row cap.
            tier:
              type: string
              enum:
                - anonymous
                - free
                - premium
              description: 'The access tier applied to this request (anonymous, free, premium).'
            ecosystem:
              type:
                - string
                - 'null'
              description: 'Slug of the active ecosystem subdomain, or null when none is in scope.'
          required:
            - limit
            - offset
            - next_cursor
            - prev_cursor
        currency:
          type: string
      required:
        - data
        - page
        - currency
    Valuation:
      type: object
      properties:
        id:
          type: number
          description: Stable Dealroom valuation id.
          example: 1234567
        entity_uuid:
          type: string
          description: UUID of the company this valuation belongs to.
          example: 345d1ab6-33df-4759-9e17-0d0c0ec9ab1c
        value:
          type:
            - number
            - 'null'
          description: >-
            Valuation amount, in the response `currency` (default USD). Null when the source amount is unknown.
          example: 92000000
        year:
          type:
            - number
            - 'null'
          description: Year the valuation applies to.
          example: 2024
        month:
          type:
            - number
            - 'null'
          description: Month (1–12) the valuation applies to.
          example: 3
        is_estimate:
          type:
            - boolean
            - 'null'
          description: Whether the value is a Dealroom estimate rather than a reported figure.
          example: false
        entity:
          type: object
          properties:
            uuid:
              type: string
              description: UUID of the company this valuation belongs to.
              example: 345d1ab6-33df-4759-9e17-0d0c0ec9ab1c
            name:
              type: string
              description: Name of the company this valuation belongs to.
              example: Index Ventures
          required:
            - uuid
            - name
          description: The company this valuation belongs to.
        deleted_at:
          type:
            - string
            - 'null'
          description: ISO 8601 timestamp when this record was soft-deleted (null = active)
          example: null
      required:
        - id
        - entity_uuid
        - value
        - year
        - month
        - is_estimate
        - deleted_at
    InvestorListResponse:
      type: object
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/Investor'
        page:
          type: object
          properties:
            total:
              type: number
            limit:
              type: number
            offset:
              type: number
            next_cursor:
              type:
                - string
                - 'null'
              description: Opaque cursor for the next page. Null when no further pages exist.
            prev_cursor:
              type:
                - string
                - 'null'
              description: Opaque cursor for the previous page. Null when on the first page.
            capped:
              type: boolean
              description: True when the requested page size was reduced to the per-tier/ecosystem row cap.
            tier:
              type: string
              enum:
                - anonymous
                - free
                - premium
              description: 'The access tier applied to this request (anonymous, free, premium).'
            ecosystem:
              type:
                - string
                - 'null'
              description: 'Slug of the active ecosystem subdomain, or null when none is in scope.'
          required:
            - limit
            - offset
            - next_cursor
            - prev_cursor
        currency:
          type: string
      required:
        - data
        - page
        - currency
    Investor:
      type: object
      properties:
        uuid:
          type: string
          description: >-
            Stable UUID of the investor. This is the sole public identifier; numeric ids are not accepted.
          example: 0f1e3a3e-2c2c-4f0d-9c9d-1d1e2a3b4c5d
        type:
          type: string
          enum:
            - organization
            - person
          description: 'Top-level entity type — `organization` for firms/funds, `person` for angel investors.'
          example: organization
        organization_subtype:
          type:
            - string
            - 'null'
          enum:
            - company
            - university
            - gov_ngo
            - investor
            - null
          description: >-
            Organization subtype (`company`, `university`, `gov_ngo`, `investor`). Null for person (angel) investors. Use this to link to the correct profile route. The value `fund` is returned only for API versions before 2026-06-19.
          example: investor
        name:
          type: string
          description: Display name of the investor.
          example: Sequoia Capital
        tagline:
          type:
            - string
            - 'null'
          description: Short one-line description of the investor.
          example: The legendary venture firm.
        image:
          type:
            - string
            - 'null'
          description: Absolute URL to the investor's logo.
          example: 'https://images.dealroom.co/logos/sequoia.png'
        dealroom_url:
          type:
            - string
            - 'null'
          description: Canonical URL on app.dealroom.co.
          example: 'https://app.dealroom.co/investors/sequoia-capital'
        website:
          type:
            - string
            - 'null'
          description: Public website URL.
          example: 'https://www.sequoiacap.com'
        website_domain:
          type:
            - string
            - 'null'
          description: Bare website domain (no protocol).
          example: sequoiacap.com
        linkedin_url:
          type:
            - string
            - 'null'
          description: LinkedIn profile URL.
          example: 'https://www.linkedin.com/company/sequoia-capital'
        twitter_url:
          type:
            - string
            - 'null'
          description: Twitter/X profile URL.
          example: 'https://twitter.com/sequoia'
        crunchbase_url:
          type:
            - string
            - 'null'
          description: Crunchbase profile URL.
          example: 'https://www.crunchbase.com/organization/sequoia-capital'
        instagram:
          type:
            - string
            - 'null'
          description: Instagram handle.
          example: sequoiacapital
        angellist:
          type:
            - string
            - 'null'
          description: AngelList profile URL.
          example: 'https://angel.co/sequoia'
        launch_year:
          type:
            - number
            - 'null'
          description: Year the firm was founded.
          example: 1972
        employee_count:
          type:
            - number
            - 'null'
          description: Latest known employee headcount.
          example: 250
        investor_rank:
          type:
            - number
            - 'null'
          description: Dealroom investor rank (lower = better). Null if unranked.
          example: 42
        hq_country:
          type:
            - string
            - 'null'
          description: HQ country name.
          example: United States
        hq_city:
          type:
            - string
            - 'null'
          description: HQ city.
          example: Menlo Park
        lat:
          type:
            - number
            - 'null'
          description: HQ latitude (decimal degrees).
          example: 37.4533
        lon:
          type:
            - number
            - 'null'
          description: HQ longitude (decimal degrees).
          example: -122.1817
        founding_country:
          type:
            - string
            - 'null'
          description: Country name where the investor was founded.
          example: United States
        founding_city:
          type:
            - string
            - 'null'
          description: City where the investor was founded.
          example: Menlo Park
        founding_lat:
          type:
            - number
            - 'null'
          description: Founding location latitude (decimal degrees).
          example: 37.4533
        founding_lon:
          type:
            - number
            - 'null'
          description: Founding location longitude (decimal degrees).
          example: -122.1817
        tags:
          type: array
          items:
            type: object
            properties:
              id:
                type: number
                description: Numeric identifier of the tag.
              name:
                type: string
                description: Display name of the tag.
              type:
                type: string
                enum:
                  - sector
                  - technology
                  - industry
                  - sub_industry
                  - business_model
                  - income_stream
                  - client_focus
                  - sdg
                  - ownership
                  - techstack_category
                  - deal_structure
                  - growth_stage
                  - investor_type
                description: 'Category of the tag (e.g. industry, sector, technology).'
            required:
              - id
              - name
              - type
          description: 'Industry, sector, and other taxonomy tags associated with the investor.'
        investor_types:
          type: array
          items:
            type: object
            properties:
              id:
                type: number
                description: Numeric identifier of the investor type.
              name:
                type: string
                description: Display name of the investor type.
              code:
                type: string
                description: Machine-readable code for the investor type.
            required:
              - id
              - name
              - code
          description: 'Investor type classifications (e.g. venture capital, corporate, angel).'
        investor_stages:
          type: array
          items:
            type: object
            properties:
              id:
                type: number
                description: Numeric identifier of the investment stage.
              name:
                type: string
                description: Display name of the investment stage.
              code:
                type: string
                description: Machine-readable code for the investment stage.
            required:
              - id
              - name
              - code
          description: 'Investment stages the investor typically participates in (e.g. seed, series a).'
        deal_sizes:
          type: object
          properties:
            min:
              type:
                - number
                - 'null'
              description: 'Minimum typical deal size, in the response `currency`.'
            max:
              type:
                - number
                - 'null'
              description: 'Maximum typical deal size, in the response `currency`.'
          required:
            - min
            - max
          description: 'Typical deal size range for the investor, in the response `currency`.'
        investments:
          type: object
          properties:
            total_count:
              type:
                - number
                - 'null'
              description: Total number of investments the investor has made.
            total_invested:
              type:
                - number
                - 'null'
              description: >-
                Total amount the investor has invested across all rounds, in the response `currency`.
            preferred_round:
              type:
                - string
                - 'null'
              description: Round type the investor most frequently participates in.
            last_investor_round_year:
              type:
                - number
                - 'null'
              description: Year of the investor's most recent investment round.
            last_investor_round_month:
              type:
                - number
                - 'null'
              description: Month of the investor's most recent investment round.
          required:
            - total_count
            - total_invested
            - preferred_round
            - last_investor_round_year
            - last_investor_round_month
          description: Summary of the funding rounds the investor has participated in.
        portfolio:
          type: object
          properties:
            companies:
              type:
                - number
                - 'null'
              description: Number of companies in the investor's portfolio.
            total_rounds:
              type:
                - number
                - 'null'
              description: Total number of funding rounds across the investor's portfolio.
            match_count:
              type:
                - number
                - 'null'
              description: >-
                Number of portfolio investments matching the requested portfolio_count_tag and/or portfolio_count_location filters.
            match_invested:
              type:
                - number
                - 'null'
              description: >-
                Total amount invested in the matching portfolio investments, in the response `currency`.
            top_companies:
              type: array
              items:
                type: object
                properties:
                  uuid:
                    type: string
                    description: Stable UUID of the portfolio company.
                    example: 345d1ab6-33df-4759-9e17-0d0c0ec9ab1c
                  name:
                    type: string
                    description: Display name of the portfolio company.
                  tagline:
                    type:
                      - string
                      - 'null'
                    description: Short one-line description of the portfolio company.
                  image:
                    type:
                      - string
                      - 'null'
                    description: Absolute URL to the portfolio company's logo.
                required:
                  - uuid
                  - name
                  - tagline
                  - image
              description: A sample of notable companies in the investor's portfolio.
          required:
            - companies
            - total_rounds
          description: Summary of the investor's portfolio companies.
        exit_count:
          type:
            - number
            - 'null'
          description: Number of portfolio companies that have had an exit round.
        exit_total_value:
          type:
            - number
            - 'null'
          description: 'Total value of all exit rounds for portfolio companies, in the response `currency`.'
        exit_pct:
          type:
            - number
            - 'null'
          description: Percentage of portfolio companies that have exited.
        portfolio_total_valuation:
          type:
            - number
            - 'null'
          description: >-
            Sum of the latest known valuations of all portfolio companies, in the response `currency`.
      required:
        - uuid
        - type
        - organization_subtype
        - name
        - tagline
        - image
        - dealroom_url
        - website
        - website_domain
        - linkedin_url
        - twitter_url
        - crunchbase_url
        - instagram
        - angellist
        - launch_year
        - employee_count
        - investor_rank
        - hq_country
        - hq_city
        - lat
        - lon
        - founding_country
        - founding_city
        - founding_lat
        - founding_lon
        - exit_count
        - exit_total_value
        - exit_pct
        - portfolio_total_valuation
    InvestorGeoResponse:
      type: object
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/InvestorGeoPoint'
        page:
          type: object
          properties:
            total:
              type: number
            limit:
              type: number
            offset:
              type: number
            next_cursor:
              type:
                - string
                - 'null'
              description: Opaque cursor for the next page. Null when no further pages exist.
            prev_cursor:
              type:
                - string
                - 'null'
              description: Opaque cursor for the previous page. Null when on the first page.
            capped:
              type: boolean
              description: True when the requested page size was reduced to the per-tier/ecosystem row cap.
            tier:
              type: string
              enum:
                - anonymous
                - free
                - premium
              description: 'The access tier applied to this request (anonymous, free, premium).'
            ecosystem:
              type:
                - string
                - 'null'
              description: 'Slug of the active ecosystem subdomain, or null when none is in scope.'
          required:
            - limit
            - offset
            - next_cursor
            - prev_cursor
      required:
        - data
        - page
    InvestorGeoPoint:
      type: object
      properties:
        id:
          type: string
          description: Stable UUID of the investor
          example: b4e2c9a1-7f3d-4e8b-9c2a-1d5f6e8a3b7c
        name:
          type:
            - string
            - 'null'
        lat:
          type: number
          description: HQ latitude (WGS84)
        lon:
          type: number
          description: HQ longitude (WGS84)
        logo:
          type:
            - string
            - 'null'
          description: >-
            Logo/avatar image URL for the investor (powers the map's logo layer); null when the entity has no image. May be a bare host/path or a full URL.
        value:
          type:
            - number
            - 'null'
          description: >-
            The `size_by` dimension's value for this investor (USD for monetary dimensions); null when there is no value or no `size_by` was requested
      required:
        - id
        - name
        - lat
        - lon
        - logo
        - value
    InvestorDetailResponse:
      type: object
      properties:
        data:
          $ref: '#/components/schemas/Investor'
        currency:
          type: string
      required:
        - data
        - currency
    EntityInvestmentsResponse:
      type: object
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/EntityInvestmentItem'
        page:
          type: object
          properties:
            total:
              type: number
            limit:
              type: number
            offset:
              type: number
            next_cursor:
              type:
                - string
                - 'null'
              description: Opaque cursor for the next page. Null when no further pages exist.
            prev_cursor:
              type:
                - string
                - 'null'
              description: Opaque cursor for the previous page. Null when on the first page.
            capped:
              type: boolean
              description: True when the requested page size was reduced to the per-tier/ecosystem row cap.
            tier:
              type: string
              enum:
                - anonymous
                - free
                - premium
              description: 'The access tier applied to this request (anonymous, free, premium).'
            ecosystem:
              type:
                - string
                - 'null'
              description: 'Slug of the active ecosystem subdomain, or null when none is in scope.'
          required:
            - limit
            - offset
            - next_cursor
            - prev_cursor
        currency:
          type: string
          description: Currency the portfolio-company monetary fields are expressed in (default USD).
          example: EUR
      required:
        - data
        - page
        - currency
    EntityInvestmentItem:
      type: object
      properties:
        company:
          type: object
          properties:
            uuid:
              type: string
              description: Stable UUID of the portfolio company.
              example: 345d1ab6-33df-4759-9e17-0d0c0ec9ab1c
            name:
              type:
                - string
                - 'null'
            image:
              type:
                - string
                - 'null'
            tagline:
              type:
                - string
                - 'null'
            status:
              type:
                - string
                - 'null'
              description: >-
                `company_status`: `operational`, `acquired`, `closed`, `low_activity`, or null when unknown.
            total_funding:
              type:
                - number
                - 'null'
              description: 'Portfolio company''s all-time total funding raised, in the response `currency`.'
            latest_valuation:
              type: object
              properties:
                value:
                  type:
                    - number
                    - 'null'
                  description: Valuation amount in the active currency; null when unknown.
                year:
                  type:
                    - number
                    - 'null'
                  description: Year the valuation was recorded.
                month:
                  type:
                    - number
                    - 'null'
                  description: Month the valuation was recorded (1-12; null when unknown).
              required:
                - value
                - year
                - month
              description: >-
                Portfolio company's most recent known valuation (`value` in the response `currency`) and the period it was recorded.
            launch_year:
              type:
                - number
                - 'null'
              description: Year the portfolio company was founded.
              example: 2018
            hq_city:
              type:
                - string
                - 'null'
              description: Portfolio company's HQ city.
              example: Berlin
            hq_country:
              type:
                - string
                - 'null'
              description: Portfolio company's HQ country.
              example: Germany
            signal_rating:
              type:
                - number
                - 'null'
              description: Dealroom signal rating (0–100) for the portfolio company.
              example: 84
          required:
            - uuid
            - name
            - image
            - tagline
            - status
            - total_funding
            - latest_valuation
            - launch_year
            - hq_city
            - hq_country
            - signal_rating
          description: The portfolio company that raised the round(s) this entity invested in.
        is_lead:
          type: boolean
          description: True when this entity led at least one round in the company.
        rounds_count:
          type: number
          description: Number of the company's rounds this entity participated in.
          example: 2
        last_round_year:
          type:
            - number
            - 'null'
          description: Year of the most recent round this entity invested in.
          example: 2023
      required:
        - company
        - is_lead
        - rounds_count
        - last_round_year
    EntityFundsResponse:
      type: object
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/EntityFundItem'
        page:
          type: object
          properties:
            total:
              type: number
            limit:
              type: number
            offset:
              type: number
            next_cursor:
              type:
                - string
                - 'null'
              description: Opaque cursor for the next page. Null when no further pages exist.
            prev_cursor:
              type:
                - string
                - 'null'
              description: Opaque cursor for the previous page. Null when on the first page.
            capped:
              type: boolean
              description: True when the requested page size was reduced to the per-tier/ecosystem row cap.
            tier:
              type: string
              enum:
                - anonymous
                - free
                - premium
              description: 'The access tier applied to this request (anonymous, free, premium).'
            ecosystem:
              type:
                - string
                - 'null'
              description: 'Slug of the active ecosystem subdomain, or null when none is in scope.'
          required:
            - limit
            - offset
            - next_cursor
            - prev_cursor
        currency:
          type: string
          description: >-
            Requested response currency (default USD) — the currency `amount` is expressed in. The original native value is in `amount_source`.
          example: EUR
      required:
        - data
        - page
        - currency
    EntityFundItem:
      type: object
      properties:
        id:
          type: number
          description: Stable Dealroom fund id (source `bobjects_funds.id`).
          example: 20386
        name:
          type:
            - string
            - 'null'
          example: Anterra F&A Ventures III
        fund_type:
          type:
            - string
            - 'null'
          description: >-
            Fund category — one of `Venture Capital`, `Private Equity`, `Growth Equity`, `Corporate`, `Life Sciences`, `Renewables`, `Fund of Funds`, `Other`.
          example: Venture Capital
        amount:
          type:
            - number
            - 'null'
          description: >-
            Fund size in the requested response `currency` (the top-level envelope `currency`, default USD), converted from the native amount. Null when the source amount is unknown or its native currency has no exchange rate.
          example: 92000000
        amount_source:
          $ref: '#/components/schemas/EntityFundAmountSource'
        fund_date:
          type:
            - string
            - 'null'
          description: Close / announcement date (ISO 8601).
          example: '2024-03-01T00:00:00.000Z'
        is_closed:
          type:
            - boolean
            - 'null'
          description: Whether the fund is closed to new commitments.
          example: false
        source_url:
          type:
            - string
            - 'null'
          description: External news / press URL announcing the fund.
          example: 'https://techfundingnews.com/anterra-closes-fund-iii/'
      required:
        - id
        - name
        - fund_type
        - amount
        - amount_source
        - fund_date
        - is_closed
        - source_url
    EntityFundAmountSource:
      type: object
      properties:
        amount:
          type:
            - number
            - 'null'
          description: 'Fund size as stored, in the fund''s own native currency.'
          example: 100000000
        currency:
          type:
            - string
            - 'null'
          description: ISO 4217 code of the fund's native currency.
          example: CAD
      required:
        - amount
        - currency
      description: 'The original as-stored fund size and its native currency, before conversion.'
    FundListResponse:
      type: object
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/Fund'
        page:
          type: object
          properties:
            total:
              type: number
            limit:
              type: number
            offset:
              type: number
            next_cursor:
              type:
                - string
                - 'null'
              description: Opaque cursor for the next page. Null when no further pages exist.
            prev_cursor:
              type:
                - string
                - 'null'
              description: Opaque cursor for the previous page. Null when on the first page.
            capped:
              type: boolean
              description: True when the requested page size was reduced to the per-tier/ecosystem row cap.
            tier:
              type: string
              enum:
                - anonymous
                - free
                - premium
              description: 'The access tier applied to this request (anonymous, free, premium).'
            ecosystem:
              type:
                - string
                - 'null'
              description: 'Slug of the active ecosystem subdomain, or null when none is in scope.'
          required:
            - limit
            - offset
            - next_cursor
            - prev_cursor
        currency:
          type: string
          description: >-
            Requested response currency (default USD) — the currency `amount` is expressed in. The original native value is in `amount_source`.
          example: EUR
      required:
        - data
        - page
        - currency
    Fund:
      type: object
      properties:
        id:
          type: number
          description: Stable Dealroom fund id (source `bobjects_funds.id`).
          example: 20386
        name:
          type:
            - string
            - 'null'
          description: Fund name as reported.
          example: Anterra F&A Ventures III
        fund_type:
          type:
            - string
            - 'null'
          description: >-
            Fund category — one of `Venture Capital`, `Private Equity`, `Growth Equity`, `Corporate`, `Life Sciences`, `Renewables`, `Fund of Funds`, `Other`.
          example: Venture Capital
        amount:
          type:
            - number
            - 'null'
          description: >-
            Fund size in the requested response `currency` (the top-level envelope `currency`, default USD), converted from the native amount. Null when the source amount is unknown or its native currency has no exchange rate.
          example: 92000000
        amount_source:
          $ref: '#/components/schemas/FundAmountSource'
        fund_date:
          type:
            - string
            - 'null'
          description: Close / announcement date (ISO 8601).
          example: '2024-03-01T00:00:00.000Z'
        is_closed:
          type:
            - boolean
            - 'null'
          description: Whether the fund is closed to new commitments.
          example: false
        source_url:
          type:
            - string
            - 'null'
          description: External news / press URL announcing the fund.
          example: 'https://techfundingnews.com/anterra-closes-fund-iii/'
        manager:
          $ref: '#/components/schemas/FundManager'
      required:
        - id
        - name
        - fund_type
        - amount
        - amount_source
        - fund_date
        - is_closed
        - source_url
        - manager
    FundAmountSource:
      type: object
      properties:
        amount:
          type:
            - number
            - 'null'
          description: 'Fund size as stored, in the fund''s own native currency.'
          example: 100000000
        currency:
          type:
            - string
            - 'null'
          description: ISO 4217 code of the fund's native currency.
          example: CAD
      required:
        - amount
        - currency
      description: 'The original as-stored fund size and its native currency, before conversion.'
    FundManager:
      type: object
      properties:
        uuid:
          type: string
          description: Entity UUID of the manager (GP) — the firm that raised the fund.
          example: 345d1ab6-33df-4759-9e17-0d0c0ec9ab1c
        name:
          type:
            - string
            - 'null'
          description: Display name of the manager firm.
          example: Index Ventures
        image:
          type:
            - string
            - 'null'
          description: 'Logo host/path; prefix with `https://` to render.'
      required:
        - uuid
        - name
        - image
      description: The investor firm (GP) that raised this fund.
    FundDetailResponse:
      type: object
      properties:
        data:
          $ref: '#/components/schemas/Fund'
        currency:
          type: string
          description: >-
            Requested response currency (default USD) — the currency `amount` is expressed in. The original native value is in `amount_source`.
          example: EUR
      required:
        - data
        - currency
    FounderListResponse:
      type: object
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/Founder'
        page:
          type: object
          properties:
            total:
              type: number
            limit:
              type: number
            offset:
              type: number
            next_cursor:
              type:
                - string
                - 'null'
              description: Opaque cursor for the next page. Null when no further pages exist.
            prev_cursor:
              type:
                - string
                - 'null'
              description: Opaque cursor for the previous page. Null when on the first page.
            capped:
              type: boolean
              description: True when the requested page size was reduced to the per-tier/ecosystem row cap.
            tier:
              type: string
              enum:
                - anonymous
                - free
                - premium
              description: 'The access tier applied to this request (anonymous, free, premium).'
            ecosystem:
              type:
                - string
                - 'null'
              description: 'Slug of the active ecosystem subdomain, or null when none is in scope.'
          required:
            - limit
            - offset
            - next_cursor
            - prev_cursor
        currency:
          type: string
          description: Currency the founder monetary fields are expressed in (default USD).
          example: EUR
      required:
        - data
        - page
        - currency
    Founder:
      type: object
      properties:
        uuid:
          type: string
          description: >-
            Stable UUID of the founder. This is the sole public identifier; numeric ids are not accepted.
          example: 1a2b3c4d-5e6f-7890-1234-567890abcdef
        name:
          type: string
          description: Display name of the founder.
          example: Patrick Collison
        tagline:
          type:
            - string
            - 'null'
          description: Short biographic line (≤ ~140 chars).
          example: Co-founder and CEO of Stripe.
        image:
          type:
            - string
            - 'null'
          description: Profile photo URL.
          example: 'https://images.dealroom.co/people/patrick-collison.jpg'
        dealroom_url:
          type:
            - string
            - 'null'
          description: Canonical URL on app.dealroom.co.
          example: 'https://app.dealroom.co/people/patrick-collison'
        gender:
          type:
            - string
            - 'null'
          description: 'Self-reported or inferred gender label, when known.'
          example: male
        is_serial_founder:
          type:
            - boolean
            - 'null'
          description: True when this person has founded more than one company.
          example: true
        is_super_founder:
          type:
            - boolean
            - 'null'
          description: Dealroom's super-founder badge — founder of a unicorn (or comparable outlier outcome).
          example: true
        is_promising_founder:
          type:
            - boolean
            - 'null'
          description: Dealroom's promising-founder signal.
          example: false
        is_strong_founder:
          type:
            - boolean
            - 'null'
          description: Dealroom's strong-founder signal.
          example: true
        launch_year:
          type:
            - number
            - 'null'
          description: Year the founder started their first recorded company (if known).
          example: 2010
        signal_rating:
          type:
            - number
            - 'null'
          description: Dealroom founder signal score (1–97). Null when unavailable.
        founded_companies_total_funding:
          type:
            - number
            - 'null'
          description: >-
            Total funding raised across all companies this founder has founded, in the response `currency`.
        hq_country:
          type:
            - string
            - 'null'
          description: Country the founder is based in.
          example: United States
        hq_city:
          type:
            - string
            - 'null'
          description: City the founder is based in.
          example: San Francisco
        tags:
          type: array
          items:
            type: object
            properties:
              id:
                type: number
                description: Numeric identifier of the tag.
              name:
                type: string
                description: Display name of the tag.
              type:
                type: string
                enum:
                  - sector
                  - technology
                  - industry
                  - sub_industry
                  - business_model
                  - income_stream
                  - client_focus
                  - sdg
                  - ownership
                  - techstack_category
                  - deal_structure
                  - growth_stage
                  - investor_type
                description: 'Category of the tag (e.g. industry, sector, technology).'
            required:
              - id
              - name
              - type
          description: Taxonomy tags describing the founder.
        education:
          type: array
          items:
            type: object
            properties:
              university_uuid:
                type: string
                description: UUID of the university the founder attended.
              university_name:
                type: string
                description: Name of the university the founder attended.
              degree:
                type:
                  - string
                  - 'null'
                description: 'Degree the founder obtained, when known.'
              year_start:
                type:
                  - number
                  - 'null'
                description: 'Year the founder started at the university, when known.'
              year_end:
                type:
                  - number
                  - 'null'
                description: 'Year the founder finished at the university, when known.'
              majors:
                type: array
                items:
                  type: string
                description: Fields of study the founder majored in.
            required:
              - university_uuid
              - university_name
              - degree
              - year_start
              - year_end
              - majors
          description: The founder's education history.
        universities:
          type: array
          items:
            type: object
            properties:
              id:
                type: number
                description: Numeric id of the education record.
              year_start:
                type:
                  - number
                  - 'null'
                description: 'Year the founder started at the university, when known.'
              year_end:
                type:
                  - number
                  - 'null'
                description: 'Year the founder finished at the university, when known.'
              degree:
                type:
                  - object
                  - 'null'
                properties:
                  id:
                    type: number
                    description: Numeric id of the degree.
                  name:
                    type: string
                    description: Name of the degree.
                required:
                  - id
                  - name
                description: 'Degree obtained in this education record, when known.'
              majors:
                type: array
                items:
                  type: object
                  properties:
                    id:
                      type: number
                      description: Numeric id of the major.
                    name:
                      type: string
                      description: Name of the major.
                  required:
                    - id
                    - name
                description: Fields of study for this education record.
              university:
                type: object
                properties:
                  uuid:
                    type: string
                    description: UUID of the university.
                  name:
                    type: string
                    description: Name of the university.
                  image:
                    type:
                      - string
                      - 'null'
                    description: University logo URL.
                  hq_city:
                    type:
                      - string
                      - 'null'
                    description: City where the university is based.
                  hq_country:
                    type:
                      - string
                      - 'null'
                    description: Country where the university is based.
                required:
                  - uuid
                  - name
                  - image
                  - hq_city
                  - hq_country
                description: The university this education record refers to.
            required:
              - id
              - year_start
              - year_end
              - degree
              - majors
              - university
          description: 'The founder''s education history with expanded university, degree, and major details.'
        companies:
          type: array
          items:
            type: object
            properties:
              entity_uuid:
                type: string
                description: UUID of the associated company.
              entity_name:
                type: string
                description: Name of the associated company.
              image:
                type:
                  - string
                  - 'null'
                description: Company logo URL.
              hq_city:
                type:
                  - string
                  - 'null'
                description: City where the company is based.
              hq_country:
                type:
                  - string
                  - 'null'
                description: Country where the company is based.
              total_funding:
                type:
                  - number
                  - 'null'
                description: 'Total funding the company has raised, in the response `currency`.'
              latest_valuation:
                type: object
                properties:
                  value:
                    type:
                      - number
                      - 'null'
                    description: Valuation amount in the active currency; null when unknown.
                  year:
                    type:
                      - number
                      - 'null'
                    description: Year the valuation was recorded.
                  month:
                    type:
                      - number
                      - 'null'
                    description: Month the valuation was recorded (1-12; null when unknown).
                required:
                  - value
                  - year
                  - month
                description: The company's most recent known valuation and the period it was recorded.
              signal_rating:
                type:
                  - number
                  - 'null'
                description: Dealroom signal score for the company. Null when unavailable.
              sector_tags:
                type: array
                items:
                  type: object
                  properties:
                    id:
                      type: number
                      description: Numeric id of the tag.
                    name:
                      type: string
                      description: Name of the tag.
                  required:
                    - id
                    - name
                description: Sector tags of the associated company.
              industries:
                type: array
                items:
                  type: object
                  properties:
                    id:
                      type: number
                      description: Numeric id of the tag.
                    name:
                      type: string
                      description: Name of the tag.
                  required:
                    - id
                    - name
                description: Industry tags of the associated company.
              is_founder:
                type:
                  - boolean
                  - 'null'
                description: True when the founder founded this company.
              is_executive:
                type:
                  - boolean
                  - 'null'
                description: True when the founder holds an executive role at this company.
              is_partner:
                type:
                  - boolean
                  - 'null'
                description: True when the founder holds a partner role at this company.
              is_past:
                type:
                  - boolean
                  - 'null'
                description: True when the founder's association with this company is a past (former) role.
              raw_title:
                type:
                  - string
                  - 'null'
                description: The founder's job title at the company as originally recorded.
              titles:
                type: array
                items:
                  type: object
                  properties:
                    name:
                      type: string
                      description: Name of the title.
                  required:
                    - name
                description: Normalized job titles the founder holds at the company.
              year_start:
                type:
                  - number
                  - 'null'
                description: 'Year the founder''s association with the company started, when known.'
              year_end:
                type:
                  - number
                  - 'null'
                description: 'Year the founder''s association with the company ended, when known.'
            required:
              - entity_uuid
              - entity_name
              - image
              - hq_city
              - hq_country
              - total_funding
              - latest_valuation
              - signal_rating
              - sector_tags
              - industries
              - is_founder
              - is_executive
              - is_partner
              - is_past
              - raw_title
              - titles
              - year_start
              - year_end
          description: 'Companies the founder is or was associated with, and their roles.'
        backgrounds:
          type: array
          items:
            type: object
            properties:
              id:
                type: number
                description: Numeric id of the background.
              name:
                type: string
                description: Name of the background.
            required:
              - id
              - name
          description: Professional backgrounds associated with the founder.
      required:
        - uuid
        - name
        - tagline
        - image
        - dealroom_url
        - gender
        - is_serial_founder
        - is_super_founder
        - is_promising_founder
        - is_strong_founder
        - launch_year
        - signal_rating
        - founded_companies_total_funding
        - hq_country
        - hq_city
    FounderDetailResponse:
      type: object
      properties:
        data:
          $ref: '#/components/schemas/Founder'
        currency:
          type: string
          description: Currency the founder monetary fields are expressed in (default USD).
          example: EUR
      required:
        - data
        - currency
    PersonCareerResponse:
      type: object
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/PersonCareerItem'
        page:
          type: object
          properties:
            total:
              type: number
            limit:
              type: number
            offset:
              type: number
            next_cursor:
              type:
                - string
                - 'null'
              description: Opaque cursor for the next page. Null when no further pages exist.
            prev_cursor:
              type:
                - string
                - 'null'
              description: Opaque cursor for the previous page. Null when on the first page.
            capped:
              type: boolean
              description: True when the requested page size was reduced to the per-tier/ecosystem row cap.
            tier:
              type: string
              enum:
                - anonymous
                - free
                - premium
              description: 'The access tier applied to this request (anonymous, free, premium).'
            ecosystem:
              type:
                - string
                - 'null'
              description: 'Slug of the active ecosystem subdomain, or null when none is in scope.'
          required:
            - limit
            - offset
            - next_cursor
            - prev_cursor
      required:
        - data
        - page
    PersonCareerItem:
      type: object
      properties:
        uuid:
          type: string
          description: Stable UUID of the organization.
        name:
          type:
            - string
            - 'null'
          example: Stripe
        tagline:
          type:
            - string
            - 'null'
          description: Short organization description.
        image:
          type:
            - string
            - 'null'
          description: 'Logo host/path, prefix with `https://` to render.'
        type:
          type: string
          enum:
            - organization
            - person
          description: Entity type of the association (`organization` or `person`).
          example: organization
        organization_subtype:
          type:
            - string
            - 'null'
          enum:
            - company
            - university
            - gov_ngo
            - investor
            - null
          description: >-
            Organization subtype (`company`, `investor`, `university`, `gov_ngo`). Use this to link to the correct profile route.
          example: company
        hq_city:
          type:
            - string
            - 'null'
          example: San Francisco
        hq_country:
          type:
            - string
            - 'null'
          example: United States
        is_founder:
          type: boolean
          description: True when the person is a founder at this organization.
        is_executive:
          type: boolean
          description: True when the person holds an executive role here.
        is_partner:
          type: boolean
          description: True when the person holds a partner role here.
        is_past:
          type: boolean
          description: >-
            True only when every recorded stint here has ended (former). False while any role is current.
        raw_title:
          type:
            - string
            - 'null'
          description: Representative raw title from the source data.
          example: Co-founder & CEO
        titles:
          type: array
          items:
            type: string
          description: Normalised job titles held here.
          example:
            - CEO
            - Co-Founder
        year_start:
          type:
            - number
            - 'null'
          description: Earliest recorded start year here.
          example: 2010
        year_end:
          type:
            - number
            - 'null'
          description: Latest recorded end year here (null when current).
          example: null
      required:
        - uuid
        - name
        - tagline
        - image
        - type
        - organization_subtype
        - hq_city
        - hq_country
        - is_founder
        - is_executive
        - is_partner
        - is_past
        - raw_title
        - titles
        - year_start
        - year_end
    PersonListResponse:
      type: object
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/Person'
        page:
          type: object
          properties:
            total:
              type: number
            limit:
              type: number
            offset:
              type: number
            next_cursor:
              type:
                - string
                - 'null'
              description: Opaque cursor for the next page. Null when no further pages exist.
            prev_cursor:
              type:
                - string
                - 'null'
              description: Opaque cursor for the previous page. Null when on the first page.
            capped:
              type: boolean
              description: True when the requested page size was reduced to the per-tier/ecosystem row cap.
            tier:
              type: string
              enum:
                - anonymous
                - free
                - premium
              description: 'The access tier applied to this request (anonymous, free, premium).'
            ecosystem:
              type:
                - string
                - 'null'
              description: 'Slug of the active ecosystem subdomain, or null when none is in scope.'
          required:
            - limit
            - offset
            - next_cursor
            - prev_cursor
        currency:
          type: string
          description: Currency the person monetary fields are expressed in (default USD).
          example: EUR
      required:
        - data
        - page
        - currency
    Person:
      type: object
      properties:
        uuid:
          type: string
          description: >-
            Stable UUID of the founder. This is the sole public identifier; numeric ids are not accepted.
          example: 1a2b3c4d-5e6f-7890-1234-567890abcdef
        name:
          type: string
          description: Display name of the founder.
          example: Patrick Collison
        tagline:
          type:
            - string
            - 'null'
          description: Short biographic line (≤ ~140 chars).
          example: Co-founder and CEO of Stripe.
        image:
          type:
            - string
            - 'null'
          description: Profile photo URL.
          example: 'https://images.dealroom.co/people/patrick-collison.jpg'
        dealroom_url:
          type:
            - string
            - 'null'
          description: Canonical URL on app.dealroom.co.
          example: 'https://app.dealroom.co/people/patrick-collison'
        gender:
          type:
            - string
            - 'null'
          description: 'Self-reported or inferred gender label, when known.'
          example: male
        is_serial_founder:
          type:
            - boolean
            - 'null'
          description: True when this person has founded more than one company.
          example: true
        is_super_founder:
          type:
            - boolean
            - 'null'
          description: Dealroom's super-founder badge — founder of a unicorn (or comparable outlier outcome).
          example: true
        is_promising_founder:
          type:
            - boolean
            - 'null'
          description: Dealroom's promising-founder signal.
          example: false
        is_strong_founder:
          type:
            - boolean
            - 'null'
          description: Dealroom's strong-founder signal.
          example: true
        launch_year:
          type:
            - number
            - 'null'
          description: Year the founder started their first recorded company (if known).
          example: 2010
        signal_rating:
          type:
            - number
            - 'null'
          description: Dealroom founder signal score (1–97). Null when unavailable.
        founded_companies_total_funding:
          type:
            - number
            - 'null'
          description: >-
            Total funding raised across all companies this founder has founded, in the response `currency`.
        hq_country:
          type:
            - string
            - 'null'
          description: Country the founder is based in.
          example: United States
        hq_city:
          type:
            - string
            - 'null'
          description: City the founder is based in.
          example: San Francisco
        tags:
          type: array
          items:
            type: object
            properties:
              id:
                type: number
                description: Numeric identifier of the tag.
              name:
                type: string
                description: Display name of the tag.
              type:
                type: string
                enum:
                  - sector
                  - technology
                  - industry
                  - sub_industry
                  - business_model
                  - income_stream
                  - client_focus
                  - sdg
                  - ownership
                  - techstack_category
                  - deal_structure
                  - growth_stage
                  - investor_type
                description: 'Category of the tag (e.g. industry, sector, technology).'
            required:
              - id
              - name
              - type
          description: Taxonomy tags describing the founder.
        education:
          type: array
          items:
            type: object
            properties:
              university_uuid:
                type: string
                description: UUID of the university the founder attended.
              university_name:
                type: string
                description: Name of the university the founder attended.
              degree:
                type:
                  - string
                  - 'null'
                description: 'Degree the founder obtained, when known.'
              year_start:
                type:
                  - number
                  - 'null'
                description: 'Year the founder started at the university, when known.'
              year_end:
                type:
                  - number
                  - 'null'
                description: 'Year the founder finished at the university, when known.'
              majors:
                type: array
                items:
                  type: string
                description: Fields of study the founder majored in.
            required:
              - university_uuid
              - university_name
              - degree
              - year_start
              - year_end
              - majors
          description: The founder's education history.
        universities:
          type: array
          items:
            type: object
            properties:
              id:
                type: number
                description: Numeric id of the education record.
              year_start:
                type:
                  - number
                  - 'null'
                description: 'Year the founder started at the university, when known.'
              year_end:
                type:
                  - number
                  - 'null'
                description: 'Year the founder finished at the university, when known.'
              degree:
                type:
                  - object
                  - 'null'
                properties:
                  id:
                    type: number
                    description: Numeric id of the degree.
                  name:
                    type: string
                    description: Name of the degree.
                required:
                  - id
                  - name
                description: 'Degree obtained in this education record, when known.'
              majors:
                type: array
                items:
                  type: object
                  properties:
                    id:
                      type: number
                      description: Numeric id of the major.
                    name:
                      type: string
                      description: Name of the major.
                  required:
                    - id
                    - name
                description: Fields of study for this education record.
              university:
                type: object
                properties:
                  uuid:
                    type: string
                    description: UUID of the university.
                  name:
                    type: string
                    description: Name of the university.
                  image:
                    type:
                      - string
                      - 'null'
                    description: University logo URL.
                  hq_city:
                    type:
                      - string
                      - 'null'
                    description: City where the university is based.
                  hq_country:
                    type:
                      - string
                      - 'null'
                    description: Country where the university is based.
                required:
                  - uuid
                  - name
                  - image
                  - hq_city
                  - hq_country
                description: The university this education record refers to.
            required:
              - id
              - year_start
              - year_end
              - degree
              - majors
              - university
          description: 'The founder''s education history with expanded university, degree, and major details.'
        companies:
          type: array
          items:
            type: object
            properties:
              entity_uuid:
                type: string
                description: UUID of the associated company.
              entity_name:
                type: string
                description: Name of the associated company.
              image:
                type:
                  - string
                  - 'null'
                description: Company logo URL.
              hq_city:
                type:
                  - string
                  - 'null'
                description: City where the company is based.
              hq_country:
                type:
                  - string
                  - 'null'
                description: Country where the company is based.
              total_funding:
                type:
                  - number
                  - 'null'
                description: 'Total funding the company has raised, in the response `currency`.'
              latest_valuation:
                type: object
                properties:
                  value:
                    type:
                      - number
                      - 'null'
                    description: Valuation amount in the active currency; null when unknown.
                  year:
                    type:
                      - number
                      - 'null'
                    description: Year the valuation was recorded.
                  month:
                    type:
                      - number
                      - 'null'
                    description: Month the valuation was recorded (1-12; null when unknown).
                required:
                  - value
                  - year
                  - month
                description: The company's most recent known valuation and the period it was recorded.
              signal_rating:
                type:
                  - number
                  - 'null'
                description: Dealroom signal score for the company. Null when unavailable.
              sector_tags:
                type: array
                items:
                  type: object
                  properties:
                    id:
                      type: number
                      description: Numeric id of the tag.
                    name:
                      type: string
                      description: Name of the tag.
                  required:
                    - id
                    - name
                description: Sector tags of the associated company.
              industries:
                type: array
                items:
                  type: object
                  properties:
                    id:
                      type: number
                      description: Numeric id of the tag.
                    name:
                      type: string
                      description: Name of the tag.
                  required:
                    - id
                    - name
                description: Industry tags of the associated company.
              is_founder:
                type:
                  - boolean
                  - 'null'
                description: True when the founder founded this company.
              is_executive:
                type:
                  - boolean
                  - 'null'
                description: True when the founder holds an executive role at this company.
              is_partner:
                type:
                  - boolean
                  - 'null'
                description: True when the founder holds a partner role at this company.
              is_past:
                type:
                  - boolean
                  - 'null'
                description: True when the founder's association with this company is a past (former) role.
              raw_title:
                type:
                  - string
                  - 'null'
                description: The founder's job title at the company as originally recorded.
              titles:
                type: array
                items:
                  type: object
                  properties:
                    name:
                      type: string
                      description: Name of the title.
                  required:
                    - name
                description: Normalized job titles the founder holds at the company.
              year_start:
                type:
                  - number
                  - 'null'
                description: 'Year the founder''s association with the company started, when known.'
              year_end:
                type:
                  - number
                  - 'null'
                description: 'Year the founder''s association with the company ended, when known.'
            required:
              - entity_uuid
              - entity_name
              - image
              - hq_city
              - hq_country
              - total_funding
              - latest_valuation
              - signal_rating
              - sector_tags
              - industries
              - is_founder
              - is_executive
              - is_partner
              - is_past
              - raw_title
              - titles
              - year_start
              - year_end
          description: 'Companies the founder is or was associated with, and their roles.'
        backgrounds:
          type: array
          items:
            type: object
            properties:
              id:
                type: number
                description: Numeric id of the background.
              name:
                type: string
                description: Name of the background.
            required:
              - id
              - name
          description: Professional backgrounds associated with the founder.
      required:
        - uuid
        - name
        - tagline
        - image
        - dealroom_url
        - gender
        - is_serial_founder
        - is_super_founder
        - is_promising_founder
        - is_strong_founder
        - launch_year
        - signal_rating
        - founded_companies_total_funding
        - hq_country
        - hq_city
    PersonDetailResponse:
      type: object
      properties:
        data:
          $ref: '#/components/schemas/Person'
        currency:
          type: string
          description: Currency the person monetary fields are expressed in (default USD).
          example: EUR
      required:
        - data
        - currency
    NewsListResponse:
      type: object
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/NewsArticle'
        page:
          type: object
          properties:
            total:
              type: number
            limit:
              type: number
            offset:
              type: number
            next_cursor:
              type:
                - string
                - 'null'
              description: Opaque cursor for the next page. Null when no further pages exist.
            prev_cursor:
              type:
                - string
                - 'null'
              description: Opaque cursor for the previous page. Null when on the first page.
            capped:
              type: boolean
              description: True when the requested page size was reduced to the per-tier/ecosystem row cap.
            tier:
              type: string
              enum:
                - anonymous
                - free
                - premium
              description: 'The access tier applied to this request (anonymous, free, premium).'
            ecosystem:
              type:
                - string
                - 'null'
              description: 'Slug of the active ecosystem subdomain, or null when none is in scope.'
          required:
            - limit
            - offset
            - next_cursor
            - prev_cursor
        currency:
          type: string
      required:
        - data
        - page
        - currency
    NewsArticle:
      type: object
      properties:
        id:
          type: number
          description: Stable Dealroom news article ID.
          example: 9876543
        url:
          type:
            - string
            - 'null'
          description: >-
            Canonical URL of the article on its publisher's site. Null for in-house editorial notes, which have no external source.
          example: 'https://techcrunch.com/2024/06/15/example-startup-raises-50m'
        slug:
          type:
            - string
            - 'null'
          description: >-
            URL-safe article slug, unique per article; canonical routing key for /news/:slug. Temporarily nullable while the BQ→AlloyDB backfill is in flight; will be required again once every row has a slug.
          example: example-startup-raises-50m-series-b-2024
        title:
          type:
            - string
            - 'null'
          description: Article headline as provided by the publisher.
          example: Example Startup raises $50M Series B led by Sequoia
        summary:
          type:
            - string
            - 'null'
          description: Short article summary (1-2 sentences).
          example: Example Startup announced a $50M Series B round…
        image_url:
          type:
            - string
            - 'null'
          description: 'Hero image URL for the article, if available.'
          example: 'https://images.example.com/news/article-9876543.jpg'
        source:
          type: string
          description: >-
            Publisher / source identifier (e.g. `techcrunch`, `bloomberg`, `perplexity`, `substack`).
          example: techcrunch
        article_type:
          type:
            - string
            - 'null'
          description: >-
            Article type. Common values: `vc_round`, `ipo`, `acquisition`, `insight`, `event`, `partnership`.
          example: vc_round
        publish_date:
          type:
            - string
            - 'null'
          description: ISO 8601 date the article was published.
          example: '2024-06-15'
        amount:
          type:
            - number
            - 'null'
          description: >-
            Deal amount in the active currency, for `vc_round`/`acquisition` articles, as a whole-unit integer.
          example: 50000000
        round_type:
          type:
            - string
            - 'null'
          description: Round type for VC-round articles (matches Transactions).
          example: SERIES_B
        deal_date:
          type:
            - string
            - 'null'
          description: ISO 8601 date the deal closed (may differ from `publish_date`).
          example: '2024-06-14'
        sector:
          type:
            - string
            - 'null'
          description: 'Sector classification, when known.'
          example: Fintech
        hq_country:
          type:
            - string
            - 'null'
          description: HQ country of the primary mentioned company.
          example: United States
        enriched_summary:
          type:
            - string
            - 'null'
          description: AI-generated multi-paragraph enrichment (when available). Plain text.
          example: 'Example Startup, a San Francisco-based fintech…'
        importance_score:
          type:
            - number
            - 'null'
          description: >-
            Editorial ranking score — higher is more prominent. Primary ordering signal for top stories (sort with `sort=-importance_score`). Null when unscored.
          example: 87.5
        is_pinned:
          type: boolean
          description: >-
            Whether this is the single most prominent (pinned) story. At most one article is pinned at a time.
          example: false
        entities:
          type: array
          items:
            type: object
            properties:
              uuid:
                type: string
                description: Stable UUID of the mentioned entity.
                example: 345d1ab6-33df-4759-9e17-0d0c0ec9ab1c
              name:
                type: string
                description: Name of the mentioned entity.
                example: Example Startup
              mention_role:
                type:
                  - string
                  - 'null'
                description: 'How the entity features in the article (e.g. `subject`, `investor`).'
                example: subject
              is_primary:
                type:
                  - boolean
                  - 'null'
                description: Whether this entity is the article's primary subject.
                example: true
              sector:
                type:
                  - string
                  - 'null'
                description: 'Sector classification of the mentioned entity, when known.'
                example: Fintech
              hq_country:
                type:
                  - string
                  - 'null'
                description: Headquarters country of the mentioned entity.
                example: United States
              industries:
                type: array
                items:
                  type: string
                description: Industry tag names for the mentioned entity.
                example:
                  - Fintech
                  - Enterprise Software
            required:
              - uuid
              - name
              - mention_role
              - is_primary
              - sector
              - hq_country
              - industries
          description: >-
            Dealroom entities (companies, investors) referenced in the article. Use these IDs to join into entity / investor endpoints.
      required:
        - id
        - url
        - slug
        - title
        - summary
        - image_url
        - source
        - article_type
        - publish_date
        - amount
        - round_type
        - deal_date
        - sector
        - hq_country
        - enriched_summary
        - importance_score
        - is_pinned
        - entities
    NewsDetailResponse:
      type: object
      properties:
        data:
          $ref: '#/components/schemas/NewsArticle'
        currency:
          type: string
      required:
        - data
        - currency
    JobsListResponse:
      type: object
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/Job'
        page:
          type: object
          properties:
            total:
              type: number
            limit:
              type: number
            offset:
              type: number
            next_cursor:
              type:
                - string
                - 'null'
              description: Opaque cursor for the next page. Null when no further pages exist.
            prev_cursor:
              type:
                - string
                - 'null'
              description: Opaque cursor for the previous page. Null when on the first page.
            capped:
              type: boolean
              description: True when the requested page size was reduced to the per-tier/ecosystem row cap.
            tier:
              type: string
              enum:
                - anonymous
                - free
                - premium
              description: 'The access tier applied to this request (anonymous, free, premium).'
            ecosystem:
              type:
                - string
                - 'null'
              description: 'Slug of the active ecosystem subdomain, or null when none is in scope.'
          required:
            - limit
            - offset
            - next_cursor
            - prev_cursor
        currency:
          type: string
      required:
        - data
        - page
        - currency
    Job:
      type: object
      properties:
        id:
          type: number
          description: Stable Dealroom job opening ID.
          example: 8765432
        entity:
          type: object
          properties:
            uuid:
              type: string
              description: Stable UUID of the hiring company.
              example: f47ac10b-58cc-4372-a567-0e02b2c3d479
            name:
              type: string
              description: Name of the hiring company.
              example: Example Startup
          required:
            - uuid
            - name
          description: The company that posted this opening.
        title:
          type:
            - string
            - 'null'
          description: Job title as provided by the source.
          example: Senior Backend Engineer
        url:
          type:
            - string
            - 'null'
          description: Canonical URL of the job posting.
          example: 'https://jobs.example.com/senior-backend-engineer'
        source:
          type:
            - string
            - 'null'
          description: 'Source / provider of the posting (e.g. `linkedin`, `predictleads`).'
          example: linkedin
        job_type:
          type:
            - string
            - 'null'
          description: Job type / category as classified by the source.
          example: engineering
        formatted_location:
          type:
            - string
            - 'null'
          description: Human-readable location string as provided by the source.
          example: 'Berlin, Germany'
        post_language:
          type:
            - string
            - 'null'
          description: Detected language of the posting (ISO 639-1).
          example: en
        latitude:
          type:
            - number
            - 'null'
          description: Latitude of the opening location in decimal degrees.
          example: 52.52
        longitude:
          type:
            - number
            - 'null'
          description: Longitude of the opening location in decimal degrees.
          example: 13.405
        date_posted:
          type:
            - string
            - 'null'
          description: ISO 8601 timestamp the opening was posted.
          example: '2024-06-15T00:00:00.000Z'
        city_unique_id:
          type:
            - number
            - 'null'
          description: Dealroom location ID (`locations.id`) for the city. Use as `city_id` filter value.
          example: 1297711
        state_unique_id:
          type:
            - number
            - 'null'
          description: Dealroom location ID (`locations.id`) for the state/province.
          example: 8205
        country_unique_id:
          type:
            - number
            - 'null'
          description: Dealroom location ID (`locations.id`) for the country.
          example: 133
        continent_unique_id:
          type:
            - number
            - 'null'
          description: Dealroom location ID (`locations.id`) for the continent.
          example: 64
        city_region_unique_ids:
          type:
            - array
            - 'null'
          items:
            type: number
          description: >-
            Dealroom location IDs (`locations.id`) for city-regions this opening belongs to. Use as `region_id` filter values.
          example:
            - 8205
      required:
        - id
        - entity
        - title
        - url
        - source
        - job_type
        - formatted_location
        - post_language
        - latitude
        - longitude
        - date_posted
        - city_unique_id
        - state_unique_id
        - country_unique_id
        - continent_unique_id
        - city_region_unique_ids
    JobDetailResponse:
      type: object
      properties:
        data:
          $ref: '#/components/schemas/Job'
        currency:
          type: string
      required:
        - data
        - currency
    SearchResponse:
      type: object
      properties:
        data:
          type: array
          items:
            type: object
            properties:
              uuid:
                type: string
              type:
                type: string
                enum:
                  - investor
                  - person
                  - company
                  - university
                  - gov_ngo
              entity_type:
                type: string
                enum:
                  - organization
                  - person
              name:
                type: string
              tagline:
                type:
                  - string
                  - 'null'
              image:
                type:
                  - string
                  - 'null'
              is_unicorn:
                type:
                  - boolean
                  - 'null'
              investor_rank:
                type:
                  - number
                  - 'null'
              website_domain:
                type:
                  - string
                  - 'null'
              hq_city:
                type:
                  - string
                  - 'null'
              hq_country:
                type:
                  - string
                  - 'null'
            required:
              - uuid
              - type
              - entity_type
              - name
              - tagline
              - image
              - is_unicorn
              - investor_rank
              - website_domain
              - hq_city
              - hq_country
      required:
        - data
    AggregateResponse:
      type: object
      properties:
        data:
          type: array
          items:
            type: object
            additionalProperties:
              anyOf:
                - type: string
                - type: number
                - type: 'null'
        query_info:
          type: object
          properties:
            source:
              type: string
            group_by:
              type: string
            metric:
              type: string
            total_groups:
              type: number
          required:
            - source
            - group_by
            - metric
            - total_groups
        currency:
          type: string
      required:
        - data
        - query_info
        - currency
    MultiMetricGroupedResponse:
      type: object
      properties:
        data:
          type: array
          items:
            type: object
            additionalProperties:
              anyOf:
                - type: string
                - type: number
                - type: 'null'
        query_info:
          type: object
          properties:
            source:
              type: string
            group_by:
              type: string
            metrics:
              type: array
              items:
                type: object
                properties:
                  label:
                    type: string
                  type:
                    type: string
                required:
                  - label
                  - type
            total_groups:
              type: number
          required:
            - source
            - group_by
            - metrics
            - total_groups
        currency:
          type: string
      required:
        - data
        - query_info
        - currency
    MultiMetricFlatResponse:
      type: object
      properties:
        data:
          type: array
          items:
            type: object
            additionalProperties:
              type: number
        query_info:
          type: object
          properties:
            source:
              type: string
            metrics:
              type: array
              items:
                type: object
                properties:
                  label:
                    type: string
                  type:
                    type: string
                required:
                  - label
                  - type
          required:
            - source
            - metrics
        currency:
          type: string
      required:
        - data
        - query_info
        - currency
    TimeseriesResponse:
      type: object
      properties:
        data:
          type: array
          items:
            type: object
            properties:
              year:
                type: integer
              value:
                type:
                  - number
                  - 'null'
            required:
              - year
              - value
        query_info:
          type: object
          properties:
            metric:
              type: string
              enum:
                - employees
                - revenue
                - valuation
                - ebitda
                - vc_funding
                - unicorns
                - vc_backed
            aggregation:
              type: string
              enum:
                - sum
                - avg
                - median
                - count
            total_years:
              type: integer
            timing_ms:
              type: number
          required:
            - metric
            - aggregation
            - total_years
            - timing_ms
        currency:
          type: string
      required:
        - data
        - query_info
    FiltersResponse:
      type: object
      properties:
        data:
          type: array
          items:
            type: object
            properties:
              key:
                type: string
              filter_key:
                type: string
              pinned_sub_type:
                type: string
              label:
                type: string
              description:
                type: string
              description_long:
                type: string
              examples:
                type: array
                items:
                  type: object
                  properties:
                    value:
                      anyOf:
                        - type: string
                        - type: number
                        - type: boolean
                    label:
                      type: string
                  required:
                    - value
              type:
                type: string
                enum:
                  - id_lookup
                  - enum
                  - boolean
                  - numeric
                  - date
                  - text
              category:
                type: string
              operators:
                type: array
                items:
                  type: string
              format:
                type: string
                enum:
                  - currency
                  - year
                  - count
              supports_type_filter:
                type: boolean
              sub_types:
                type: array
                items:
                  type: object
                  properties:
                    key:
                      type: string
                    label:
                      type: string
                  required:
                    - key
                    - label
              data_status:
                type: object
                properties:
                  kind:
                    type: string
                    enum:
                      - stub
                      - data-incomplete
                      - unloaded
                      - partial
                  reason:
                    type: string
                  gap_id:
                    type: string
                required:
                  - kind
                  - reason
                  - gap_id
                description: >-
                  Present only when the filter is not fully functional today. See `docs/api-gaps.md` for the full registry.
              deprecated:
                type: string
                description: >-
                  Present when the filter is deprecated: the notice explains the preferred replacement (the filter still works for now).
            required:
              - key
              - filter_key
              - label
              - type
              - category
              - operators
      required:
        - data
    FilterSearchResponse:
      type: object
      properties:
        data:
          type: array
          items:
            oneOf:
              - type: object
                properties:
                  kind:
                    type: string
                    enum:
                      - value
                  filter_key:
                    type: string
                  filter_picker_key:
                    type: string
                  filter_label:
                    type: string
                  pinned_sub_type:
                    type: string
                  label:
                    type: string
                  value:
                    type: string
                  entity_count:
                    type: number
                  source_type:
                    type: string
                required:
                  - kind
                  - filter_key
                  - filter_picker_key
                  - filter_label
                  - label
                  - value
              - type: object
                properties:
                  kind:
                    type: string
                    enum:
                      - filter
                  filter_key:
                    type: string
                  filter_picker_key:
                    type: string
                  filter_label:
                    type: string
                  pinned_sub_type:
                    type: string
                  description:
                    type: string
                  category:
                    type: string
                required:
                  - kind
                  - filter_key
                  - filter_picker_key
                  - filter_label
                  - category
              - type: object
                properties:
                  kind:
                    type: string
                    enum:
                      - year
                  filter_key:
                    type: string
                  filter_picker_key:
                    type: string
                  filter_label:
                    type: string
                  pinned_sub_type:
                    type: string
                  label:
                    type: string
                  value:
                    type: string
                  operator:
                    type: string
                    enum:
                      - gte
                      - lte
                      - eq
                required:
                  - kind
                  - filter_key
                  - filter_picker_key
                  - filter_label
                  - label
                  - value
                  - operator
      required:
        - data
    FilterValuesResponse:
      type: object
      properties:
        data:
          type: array
          items:
            type: object
            properties:
              id:
                anyOf:
                  - type: number
                  - type: string
              code:
                type:
                  - string
                  - 'null'
              name:
                type: string
              entity_count:
                type:
                  - number
                  - 'null'
                description: >-
                  Number of matching entities in the requested scope. `null` unless `include_counts=true`.
              type:
                type: string
              parent_name:
                type:
                  - string
                  - 'null'
              lat:
                type:
                  - number
                  - 'null'
              lon:
                type:
                  - number
                  - 'null'
              description:
                type:
                  - string
                  - 'null'
              image:
                type:
                  - string
                  - 'null'
              hq_city:
                type:
                  - string
                  - 'null'
              hq_country:
                type:
                  - string
                  - 'null'
              website_domain:
                type:
                  - string
                  - 'null'
            required:
              - id
              - code
              - name
              - entity_count
        page:
          type: object
          properties:
            total:
              type: number
              description: >-
                Row count in this response — NOT the total match count. Use `has_more` to detect a next page.
            limit:
              type: number
            offset:
              type: number
            has_more:
              type: boolean
              description: Whether more values exist beyond this page (offset + limit).
          required:
            - total
            - limit
            - offset
            - has_more
      required:
        - data
        - page
  parameters:
    ApiVersion:
      name: API-Version
      in: header
      required: false
      schema:
        type: string
        format: date
        example: '2026-09-01'
      description: >-
        Pin a Stripe-style date-based API version (`YYYY-MM-DD`). Omit to use the latest version (`2026-09-01`). A pinned version is supported for 30 days after it is superseded, after which it returns `400`.
  headers:
    Deprecation:
      description: >-
        Present when the request pinned a superseded version: the date that version was deprecated (`YYYY-MM-DD`).
      schema:
        type: string
        format: date
    Sunset:
      description: >-
        Present when the request pinned a superseded version: the date the version stops working and requests begin returning `400` (`YYYY-MM-DD`).
      schema:
        type: string
        format: date
paths:
  /health:
    get:
      operationId: health
      security: []
      tags:
        - Health
      summary: Check API health
      description: >-
        Public liveness probe. Returns `200` when the API can reach the database, `503` otherwise. No authentication required — safe to use from uptime monitors and load-balancer health checks.
      responses:
        '200':
          description: Service is healthy
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HealthResponse'
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '503':
          description: Service is unhealthy
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HealthResponse'
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
      parameters:
        - $ref: '#/components/parameters/ApiVersion'
  /:
    get:
      operationId: getApiRoot
      security: []
      tags:
        - Discovery
      summary: API Root Discovery
      description: >-
        Programmatic entry point for the Dealroom API. Returns available functional namespaces and links to documentation. Follow a namespace `url` to discover the resources it contains.
      responses:
        '200':
          description: API discovery metadata
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DiscoveryResponse'
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
      parameters:
        - $ref: '#/components/parameters/ApiVersion'
  /data:
    get:
      operationId: getDataNamespace
      security: []
      tags:
        - Discovery
      summary: Data Namespace Discovery
      description: >-
        Lists the resources available under the `data` namespace. Raw domain data: companies, investors, founders, people, funding rounds, valuations, news, jobs, and cross-resource search.
      responses:
        '200':
          description: data namespace metadata
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/NamespaceDiscoveryResponse'
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
      parameters:
        - $ref: '#/components/parameters/ApiVersion'
  /analytics:
    get:
      operationId: getAnalyticsNamespace
      security: []
      tags:
        - Discovery
      summary: Analytics Namespace Discovery
      description: >-
        Lists the resources available under the `analytics` namespace. Computed metrics: composable single- and multi-metric aggregates and yearly entity timeseries.
      responses:
        '200':
          description: analytics namespace metadata
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/NamespaceDiscoveryResponse'
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
      parameters:
        - $ref: '#/components/parameters/ApiVersion'
  /reference:
    get:
      operationId: getReferenceNamespace
      security: []
      tags:
        - Discovery
      summary: Reference Namespace Discovery
      description: >-
        Lists the resources available under the `reference` namespace. Taxonomy & discovery: filters and curated landscapes.
      responses:
        '200':
          description: reference namespace metadata
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/NamespaceDiscoveryResponse'
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
      parameters:
        - $ref: '#/components/parameters/ApiVersion'
  /data/entities:
    get:
      operationId: listEntities
      security:
        - oauth2:
            - 'read:entities'
        - bearerAuth:
            - 'read:entities'
      tags:
        - Entities
      summary: List entities
      description: >-
        Returns a paginated list of entities — the unified index across companies, investors, people, and universities. Filter by 90+ keys (funding, location, sector, status, etc.), sort by any indexed field, and page through results. Monetary fields are converted to the requested `?currency=` (default USD).
      parameters:
        - schema:
            type: string
            description: >
              Filter expression using nested syntax.


              Examples:

              - Single: total_funding[gte]:1000000

              - Explicit ref: entity.total_funding[gte]:1000000

              - AND: and(total_funding[gte]:1000000,is_unicorn[eq]:true)

              - OR: or(hq_location[eq]:628061,hq_location[eq]:1297711)

              - Nested: and(or(hq_location[eq]:628061,hq_location[eq]:1297711),total_funding[gte]:1000000)

              - Relationship path: investor.total_invested_usd[gte]:100000000

              - Two-hop relationship: founder__employer.tag_id[eq]:123


              Operators: eq, neq, gt, gte, lt, lte, in_any, nin_any

              in_all / nin_all are only available on repeated related-record filters.

              Default ref: 'entity' (can be omitted for entity filters)

              Relationship filters: Use dot syntax (investor.field) for single-hop and

                double-underscore+dot (outerRel__innerRel.field) for two-hop relationships.
            example: 'and(total_funding[gte]:1000000,hq_location[eq]:233)'
          required: false
          description: >
            Filter expression using nested syntax.


            Examples:

            - Single: total_funding[gte]:1000000

            - Explicit ref: entity.total_funding[gte]:1000000

            - AND: and(total_funding[gte]:1000000,is_unicorn[eq]:true)

            - OR: or(hq_location[eq]:628061,hq_location[eq]:1297711)

            - Nested: and(or(hq_location[eq]:628061,hq_location[eq]:1297711),total_funding[gte]:1000000)

            - Relationship path: investor.total_invested_usd[gte]:100000000

            - Two-hop relationship: founder__employer.tag_id[eq]:123


            Operators: eq, neq, gt, gte, lt, lte, in_any, nin_any

            in_all / nin_all are only available on repeated related-record filters.

            Default ref: 'entity' (can be omitted for entity filters)

            Relationship filters: Use dot syntax (investor.field) for single-hop and

              double-underscore+dot (outerRel__innerRel.field) for two-hop relationships.
          name: filter
          in: query
        - schema:
            type: integer
            format: int32
            minimum: 1
            maximum: 500
            default: 25
            description: 'Number of results to return (1-500, default 25)'
            example: 25
          required: false
          description: 'Number of results to return (1-500, default 25)'
          name: limit
          in: query
        - schema:
            type: integer
            format: int32
            minimum: 0
            default: 0
            description: >-
              Number of results to skip before returning data. Combine with `limit` for offset-based pagination.
            example: 0
          required: false
          description: >-
            Number of results to skip before returning data. Combine with `limit` for offset-based pagination.
          name: offset
          in: query
        - schema:
            type: string
            description: >-
              Opaque cursor token from a previous response's `page.next_cursor` or `page.prev_cursor`. Round-trip it as-is — do not decode or modify.
            example: eyJ2IjoxLCJkIjoibmV4dCJ9
          required: false
          description: >-
            Opaque cursor token from a previous response's `page.next_cursor` or `page.prev_cursor`. Round-trip it as-is — do not decode or modify.
          name: cursor
          in: query
        - schema:
            type: string
            pattern: '^-?[\w,]+$'
            description: >-
              Sort by one or more keys. Prefix with `-` for descending order; comma-separated for multi-key sorts.
            example: '-launch_date'
          required: false
          description: >-
            Sort by one or more keys. Prefix with `-` for descending order; comma-separated for multi-key sorts.
          name: sort
          in: query
        - schema:
            type: boolean
            description: >-
              Pass `true` to include `page.total` (the matching record count) in the response. Default omits the total to avoid a count query.
            example: true
          required: false
          description: >-
            Pass `true` to include `page.total` (the matching record count) in the response. Default omits the total to avoid a count query.
          name: include_total
          in: query
        - schema:
            type: string
            description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
            example: EUR
          required: false
          description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
          name: currency
          in: query
        - $ref: '#/components/parameters/ApiVersion'
      responses:
        '200':
          description: List of entities
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EntityListResponse'
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '401':
          description: >-
            Authentication required. The `Authorization` header was missing, the bearer token was malformed, or the token failed signature / expiry validation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: UNAUTHORIZED
                  message: Authentication required — provide a valid bearer token.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '403':
          description: >-
            Authentication succeeded but the caller's token does not include the permission required for this operation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FORBIDDEN
                  message: You do not have permission to perform this action.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '422':
          description: Validation error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FILTER_PARSE_ERROR
                  message: >-
                    The request could not be processed — check the filter syntax and any identifiers.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '429':
          description: Rate limit exceeded.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
            Retry-After:
              schema:
                type: string
                description: Seconds to wait before retrying.
                example: '1'
              required: true
              description: Seconds to wait before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: RATE_LIMITED
                  message: Rate limit exceeded — retry after the delay in the `Retry-After` header.
  /data/entities/geo:
    get:
      operationId: listEntityGeo
      security:
        - oauth2:
            - 'read:entities'
        - bearerAuth:
            - 'read:entities'
      tags:
        - Entities
      summary: List entity geo points
      description: >-
        Lightweight endpoint designed to power map/geo visualizations, returning only id, name, lat, lon, country, and city. Supports the same filters as the entity list but with higher limits (up to 5000) and minimal payload.
      parameters:
        - schema:
            type: string
            description: |
              Filter expression for geo points (same syntax as entity list).

              Examples:
              - Single: organization_subtype[eq]:company
              - AND: and(organization_subtype[eq]:company,hq_location[eq]:233)

              Operators: eq, neq, gt, gte, lt, lte, in_any, nin_any
            example: 'and(organization_subtype[eq]:company,hq_location[eq]:233)'
          required: false
          description: |
            Filter expression for geo points (same syntax as entity list).

            Examples:
            - Single: organization_subtype[eq]:company
            - AND: and(organization_subtype[eq]:company,hq_location[eq]:233)

            Operators: eq, neq, gt, gte, lt, lte, in_any, nin_any
          name: filter
          in: query
        - schema:
            type: integer
            format: int32
            minimum: 1
            maximum: 5000
            default: 25
            description: 'Number of results to return (1-5000, default 25)'
            example: 25
          required: false
          description: 'Number of results to return (1-5000, default 25)'
          name: limit
          in: query
        - schema:
            type: integer
            format: int32
            minimum: 0
            default: 0
            description: >-
              Number of results to skip before returning data. Combine with `limit` for offset-based pagination.
            example: 0
          required: false
          description: >-
            Number of results to skip before returning data. Combine with `limit` for offset-based pagination.
          name: offset
          in: query
        - schema:
            type: string
            description: >-
              Opaque cursor token from a previous response's `page.next_cursor` or `page.prev_cursor`. Round-trip it as-is — do not decode or modify.
            example: eyJ2IjoxLCJkIjoibmV4dCJ9
          required: false
          description: >-
            Opaque cursor token from a previous response's `page.next_cursor` or `page.prev_cursor`. Round-trip it as-is — do not decode or modify.
          name: cursor
          in: query
        - schema:
            type: string
            pattern: '^-?[\w,]+$'
            description: >-
              Sort by one or more keys. Prefix with `-` for descending order; comma-separated for multi-key sorts.
            example: '-launch_date'
          required: false
          description: >-
            Sort by one or more keys. Prefix with `-` for descending order; comma-separated for multi-key sorts.
          name: sort
          in: query
        - schema:
            type: boolean
            description: >-
              Pass `true` to include `page.total` (the matching record count) in the response. Default omits the total to avoid a count query.
            example: true
          required: false
          description: >-
            Pass `true` to include `page.total` (the matching record count) in the response. Default omits the total to avoid a count query.
          name: include_total
          in: query
        - schema:
            type: string
            description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
            example: EUR
          required: false
          description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
          name: currency
          in: query
        - $ref: '#/components/parameters/ApiVersion'
      responses:
        '200':
          description: List of geo points
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GeoPointListResponse'
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '401':
          description: >-
            Authentication required. The `Authorization` header was missing, the bearer token was malformed, or the token failed signature / expiry validation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: UNAUTHORIZED
                  message: Authentication required — provide a valid bearer token.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '403':
          description: >-
            Authentication succeeded but the caller's token does not include the permission required for this operation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FORBIDDEN
                  message: You do not have permission to perform this action.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '422':
          description: Validation error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FILTER_PARSE_ERROR
                  message: >-
                    The request could not be processed — check the filter syntax and any identifiers.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '429':
          description: Rate limit exceeded.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
            Retry-After:
              schema:
                type: string
                description: Seconds to wait before retrying.
                example: '1'
              required: true
              description: Seconds to wait before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: RATE_LIMITED
                  message: Rate limit exceeded — retry after the delay in the `Retry-After` header.
  '/data/entities/{id}':
    get:
      operationId: getEntity
      security:
        - oauth2:
            - 'read:entities'
        - bearerAuth:
            - 'read:entities'
      tags:
        - Entities
      summary: Get single entity
      description: >-
        Returns the full entity record by UUID (numeric IDs are not accepted). The response shape varies by entity type — companies, investors, people, and universities each expose an optional sub-object (`company`, `investor`, `person`, `university`) alongside the shared base fields. Read the `type` / `organization_subtype` / role flags here, then call the matching typed collection for relationship sub-resources (e.g. `/companies/{id}/team`, `/investors/{id}/portfolio`). Monetary fields convert to the requested `?currency=` (default USD).
      parameters:
        - schema:
            type: string
            minLength: 1
            format: uuid
            example: 345d1ab6-33df-4759-9e17-0d0c0ec9ab1c
            description: Stable UUID of the entity. Numeric ids are not accepted.
          required: true
          description: Stable UUID of the entity. Numeric ids are not accepted.
          name: id
          in: path
        - schema:
            type: string
            description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
            example: EUR
          required: false
          description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
          name: currency
          in: query
        - $ref: '#/components/parameters/ApiVersion'
      responses:
        '200':
          description: Single entity
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EntityDetailResponse'
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '401':
          description: >-
            Authentication required. The `Authorization` header was missing, the bearer token was malformed, or the token failed signature / expiry validation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: UNAUTHORIZED
                  message: Authentication required — provide a valid bearer token.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '403':
          description: >-
            Authentication succeeded but the caller's token does not include the permission required for this operation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FORBIDDEN
                  message: You do not have permission to perform this action.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '404':
          description: Entity not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: NOT_FOUND
                  message: The requested resource was not found.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '429':
          description: Rate limit exceeded.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
            Retry-After:
              schema:
                type: string
                description: Seconds to wait before retrying.
                example: '1'
              required: true
              description: Seconds to wait before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: RATE_LIMITED
                  message: Rate limit exceeded — retry after the delay in the `Retry-After` header.
  '/data/entities/{id}/lp-funds':
    get:
      operationId: entityLpFunds
      security:
        - oauth2:
            - 'read:entities'
        - bearerAuth:
            - 'read:entities'
      tags:
        - Entities
      summary: List LP fund positions
      description: >-
        Lists the investor firms whose known limited partners include this entity — e.g. the accelerator programmes and VC firms a university has committed capital to. Each row is an investor-firm entity (not an `investment_fund` vehicle) and carries its investor type names. The source data holds only the LP↔firm pair, so no commitment amount or date is available. Retained on `/entities/{id}` (the one facet-scoping exception) until ENG-432 introduces the LP role lens and rename.
      parameters:
        - schema:
            type: string
            minLength: 1
            format: uuid
            example: 345d1ab6-33df-4759-9e17-0d0c0ec9ab1c
            description: Stable UUID of the entity. Numeric ids are not accepted.
          required: true
          description: Stable UUID of the entity. Numeric ids are not accepted.
          name: id
          in: path
        - schema:
            type: string
            description: |
              Filter expression for the investor firms — same syntax and keys as /data/investors.

              Operators: eq, neq, gt, gte, lt, lte, in_any, nin_any
              Default ref: 'entity'
            example: 'investor_type[eq]:venture_capital'
          required: false
          description: |
            Filter expression for the investor firms — same syntax and keys as /data/investors.

            Operators: eq, neq, gt, gte, lt, lte, in_any, nin_any
            Default ref: 'entity'
          name: filter
          in: query
        - schema:
            type: integer
            format: int32
            minimum: 1
            maximum: 500
            default: 25
            description: 'Number of results to return (1-500, default 25)'
            example: 25
          required: false
          description: 'Number of results to return (1-500, default 25)'
          name: limit
          in: query
        - schema:
            type: integer
            format: int32
            minimum: 0
            default: 0
            description: >-
              Number of results to skip before returning data. Combine with `limit` for offset-based pagination.
            example: 0
          required: false
          description: >-
            Number of results to skip before returning data. Combine with `limit` for offset-based pagination.
          name: offset
          in: query
        - schema:
            type: boolean
            description: >-
              Pass `true` to include `page.total` (the matching record count) in the response. Default omits the total to avoid a count query.
            example: true
          required: false
          description: >-
            Pass `true` to include `page.total` (the matching record count) in the response. Default omits the total to avoid a count query.
          name: include_total
          in: query
        - schema:
            type: string
            description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
            example: EUR
          required: false
          description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
          name: currency
          in: query
        - $ref: '#/components/parameters/ApiVersion'
      responses:
        '200':
          description: Investor firms with this entity as a known LP
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EntityLpFundsResponse'
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '400':
          description: Invalid entity ID
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: VALIDATION_ERROR
                  message: The request was malformed or failed validation.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '401':
          description: >-
            Authentication required. The `Authorization` header was missing, the bearer token was malformed, or the token failed signature / expiry validation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: UNAUTHORIZED
                  message: Authentication required — provide a valid bearer token.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '403':
          description: >-
            Authentication succeeded but the caller's token does not include the permission required for this operation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FORBIDDEN
                  message: You do not have permission to perform this action.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '429':
          description: Rate limit exceeded.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
            Retry-After:
              schema:
                type: string
                description: Seconds to wait before retrying.
                example: '1'
              required: true
              description: Seconds to wait before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: RATE_LIMITED
                  message: Rate limit exceeded — retry after the delay in the `Retry-After` header.
  /data/companies:
    get:
      operationId: listCompanies
      security:
        - oauth2:
            - 'read:entities'
        - bearerAuth:
            - 'read:entities'
      tags:
        - Companies
      summary: List companies
      description: >-
        Returns a paginated list of companies (entities with `organization_subtype = company`) — the subset of the entity index that excludes investors, universities, and gov/NGOs. Supports the full entity filter syntax, sorting, and pagination. Monetary fields convert to the requested `?currency=` (default USD).
      parameters:
        - schema:
            type: string
            description: |
              Filter expression for companies (organization_subtype = company) using nested syntax.

              Examples:
              - Single: total_funding[gte]:1000000
              - AND: and(total_funding[gte]:1000000,is_unicorn[eq]:true)
              - OR: or(hq_location[eq]:628061,hq_location[eq]:1297711)
              - Relationship path: investor.total_invested_usd[gte]:100000000

              Operators: eq, neq, gt, gte, lt, lte, in_any, nin_any
              in_all / nin_all are only available on repeated related-record filters.
              Default ref: 'entity' (can be omitted for entity filters)
            example: 'and(total_funding[gte]:1000000,is_unicorn[eq]:true)'
          required: false
          description: |
            Filter expression for companies (organization_subtype = company) using nested syntax.

            Examples:
            - Single: total_funding[gte]:1000000
            - AND: and(total_funding[gte]:1000000,is_unicorn[eq]:true)
            - OR: or(hq_location[eq]:628061,hq_location[eq]:1297711)
            - Relationship path: investor.total_invested_usd[gte]:100000000

            Operators: eq, neq, gt, gte, lt, lte, in_any, nin_any
            in_all / nin_all are only available on repeated related-record filters.
            Default ref: 'entity' (can be omitted for entity filters)
          name: filter
          in: query
        - schema:
            type: integer
            format: int32
            minimum: 1
            maximum: 500
            default: 25
            description: 'Number of results to return (1-500, default 25)'
            example: 25
          required: false
          description: 'Number of results to return (1-500, default 25)'
          name: limit
          in: query
        - schema:
            type: integer
            format: int32
            minimum: 0
            default: 0
            description: >-
              Number of results to skip before returning data. Combine with `limit` for offset-based pagination.
            example: 0
          required: false
          description: >-
            Number of results to skip before returning data. Combine with `limit` for offset-based pagination.
          name: offset
          in: query
        - schema:
            type: string
            description: >-
              Opaque cursor token from a previous response's `page.next_cursor` or `page.prev_cursor`. Round-trip it as-is — do not decode or modify.
            example: eyJ2IjoxLCJkIjoibmV4dCJ9
          required: false
          description: >-
            Opaque cursor token from a previous response's `page.next_cursor` or `page.prev_cursor`. Round-trip it as-is — do not decode or modify.
          name: cursor
          in: query
        - schema:
            type: string
            pattern: '^-?[\w,]+$'
            description: >-
              Sort by one or more keys. Prefix with `-` for descending order; comma-separated for multi-key sorts.
            example: '-launch_date'
          required: false
          description: >-
            Sort by one or more keys. Prefix with `-` for descending order; comma-separated for multi-key sorts.
          name: sort
          in: query
        - schema:
            type: boolean
            description: >-
              Pass `true` to include `page.total` (the matching record count) in the response. Default omits the total to avoid a count query.
            example: true
          required: false
          description: >-
            Pass `true` to include `page.total` (the matching record count) in the response. Default omits the total to avoid a count query.
          name: include_total
          in: query
        - schema:
            type: string
            description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
            example: EUR
          required: false
          description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
          name: currency
          in: query
        - $ref: '#/components/parameters/ApiVersion'
      responses:
        '200':
          description: List of companies
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CompanyListResponse'
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '401':
          description: >-
            Authentication required. The `Authorization` header was missing, the bearer token was malformed, or the token failed signature / expiry validation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: UNAUTHORIZED
                  message: Authentication required — provide a valid bearer token.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '403':
          description: >-
            Authentication succeeded but the caller's token does not include the permission required for this operation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FORBIDDEN
                  message: You do not have permission to perform this action.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '422':
          description: Validation error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FILTER_PARSE_ERROR
                  message: >-
                    The request could not be processed — check the filter syntax and any identifiers.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '429':
          description: Rate limit exceeded.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
            Retry-After:
              schema:
                type: string
                description: Seconds to wait before retrying.
                example: '1'
              required: true
              description: Seconds to wait before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: RATE_LIMITED
                  message: Rate limit exceeded — retry after the delay in the `Retry-After` header.
  /data/companies/geo:
    get:
      operationId: listCompanyGeoPoints
      security:
        - oauth2:
            - 'read:entities'
        - bearerAuth:
            - 'read:entities'
      tags:
        - Companies
      summary: List company map points
      description: >-
        Slim company payload for map rendering (the startup map's dot layer): one point per company with HQ coordinates and an optional `size_by` metric value. Accepts the same filter syntax as `/companies`. When `size_by` is set, points sort by that dimension descending, so capped responses keep the highest-value points. Companies without usable HQ coordinates are omitted. Monetary values are USD. For per-area counts (the map's choropleth layer), use the aggregate endpoint: GET /analytics/aggregate/companies?metric=count&group_by=map_area.
      parameters:
        - schema:
            type: string
            description: >-
              Filter expression for companies — identical syntax and semantics to the `/companies` list filter.
            example: 'and(total_funding[gte]:1000000,is_unicorn[eq]:true)'
          required: false
          description: >-
            Filter expression for companies — identical syntax and semantics to the `/companies` list filter.
          name: filter
          in: query
        - schema:
            type: string
            enum:
              - total_funding
              - employee_count
              - latest_valuation
              - total_invested
              - total_investments_count
              - alumni_count
              - alumni_founder_count
            description: >-
              Numeric dimension returned as each point's `value` (for proportional dot sizing). Monetary dimensions are USD. Also sorts the result descending, so a capped response keeps the highest-value points. Omitted → `value` is null and the default sort applies.
            example: total_funding
          required: false
          description: >-
            Numeric dimension returned as each point's `value` (for proportional dot sizing). Monetary dimensions are USD. Also sorts the result descending, so a capped response keeps the highest-value points. Omitted → `value` is null and the default sort applies.
          name: size_by
          in: query
        - schema:
            type: integer
            format: int32
            minimum: 1
            maximum: 5000
            default: 5000
            description: 'Number of results to return (1-5000, default 5000)'
            example: 5000
          required: false
          description: 'Number of results to return (1-5000, default 5000)'
          name: limit
          in: query
        - schema:
            type: integer
            format: int32
            minimum: 0
            default: 0
            description: >-
              Number of results to skip before returning data. Combine with `limit` for offset-based pagination.
            example: 0
          required: false
          description: >-
            Number of results to skip before returning data. Combine with `limit` for offset-based pagination.
          name: offset
          in: query
        - $ref: '#/components/parameters/ApiVersion'
      responses:
        '200':
          description: Company map points
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CompanyGeoResponse'
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '401':
          description: >-
            Authentication required. The `Authorization` header was missing, the bearer token was malformed, or the token failed signature / expiry validation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: UNAUTHORIZED
                  message: Authentication required — provide a valid bearer token.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '403':
          description: >-
            Authentication succeeded but the caller's token does not include the permission required for this operation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FORBIDDEN
                  message: You do not have permission to perform this action.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '422':
          description: Validation error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FILTER_PARSE_ERROR
                  message: >-
                    The request could not be processed — check the filter syntax and any identifiers.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '429':
          description: Rate limit exceeded.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
            Retry-After:
              schema:
                type: string
                description: Seconds to wait before retrying.
                example: '1'
              required: true
              description: Seconds to wait before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: RATE_LIMITED
                  message: Rate limit exceeded — retry after the delay in the `Retry-After` header.
  '/data/companies/{id}':
    get:
      operationId: getCompany
      security:
        - oauth2:
            - 'read:entities'
        - bearerAuth:
            - 'read:entities'
      tags:
        - Companies
      summary: Get single company
      description: >-
        Returns the full company record by UUID (numeric IDs are not accepted), including the `company` sub-object (unicorn/VC-backed flags, status, traffic) alongside the shared entity base fields. Monetary fields convert to the requested `?currency=` (default USD).
      parameters:
        - schema:
            type: string
            minLength: 1
            format: uuid
            example: 345d1ab6-33df-4759-9e17-0d0c0ec9ab1c
            description: Stable UUID of the entity. Numeric ids are not accepted.
          required: true
          description: Stable UUID of the entity. Numeric ids are not accepted.
          name: id
          in: path
        - schema:
            type: string
            description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
            example: EUR
          required: false
          description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
          name: currency
          in: query
        - $ref: '#/components/parameters/ApiVersion'
      responses:
        '200':
          description: Single company
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CompanyDetailResponse'
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '401':
          description: >-
            Authentication required. The `Authorization` header was missing, the bearer token was malformed, or the token failed signature / expiry validation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: UNAUTHORIZED
                  message: Authentication required — provide a valid bearer token.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '403':
          description: >-
            Authentication succeeded but the caller's token does not include the permission required for this operation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FORBIDDEN
                  message: You do not have permission to perform this action.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '404':
          description: Company not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: NOT_FOUND
                  message: The requested resource was not found.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '429':
          description: Rate limit exceeded.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
            Retry-After:
              schema:
                type: string
                description: Seconds to wait before retrying.
                example: '1'
              required: true
              description: Seconds to wait before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: RATE_LIMITED
                  message: Rate limit exceeded — retry after the delay in the `Retry-After` header.
  '/data/companies/{id}/funding-rounds':
    get:
      operationId: companyFundingRounds
      security:
        - oauth2:
            - 'read:entities'
        - bearerAuth:
            - 'read:entities'
      tags:
        - Companies
      summary: List funding rounds
      description: >-
        Funding-related transactions (rounds, equity events, debt, grants) for a company, newest first. The same underlying transactions as the `/data/transactions` collection, scoped to this company, but in a slimmer shape — the collection's `entity_uuid`, `company`, `created_at`, and `deleted_at` fields are omitted. Monetary fields (`amount`, `valuation`) convert to the requested `?currency=` (default USD).
      parameters:
        - schema:
            type: string
            minLength: 1
            format: uuid
            example: 345d1ab6-33df-4759-9e17-0d0c0ec9ab1c
            description: Stable UUID of the entity. Numeric ids are not accepted.
          required: true
          description: Stable UUID of the entity. Numeric ids are not accepted.
          name: id
          in: path
        - schema:
            type: integer
            format: int32
            minimum: 1
            maximum: 500
            default: 100
            description: 'Number of results to return (1-500, default 100)'
            example: 100
          required: false
          description: 'Number of results to return (1-500, default 100)'
          name: limit
          in: query
        - schema:
            type: integer
            format: int32
            minimum: 0
            default: 0
            description: >-
              Number of results to skip before returning data. Combine with `limit` for offset-based pagination.
            example: 0
          required: false
          description: >-
            Number of results to skip before returning data. Combine with `limit` for offset-based pagination.
          name: offset
          in: query
        - schema:
            type: string
            description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
            example: EUR
          required: false
          description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
          name: currency
          in: query
        - $ref: '#/components/parameters/ApiVersion'
      responses:
        '200':
          description: Company funding rounds
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EntityTransactionsResponse'
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '400':
          description: Invalid entity ID
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: VALIDATION_ERROR
                  message: The request was malformed or failed validation.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '401':
          description: >-
            Authentication required. The `Authorization` header was missing, the bearer token was malformed, or the token failed signature / expiry validation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: UNAUTHORIZED
                  message: Authentication required — provide a valid bearer token.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '403':
          description: >-
            Authentication succeeded but the caller's token does not include the permission required for this operation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FORBIDDEN
                  message: You do not have permission to perform this action.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '429':
          description: Rate limit exceeded.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
            Retry-After:
              schema:
                type: string
                description: Seconds to wait before retrying.
                example: '1'
              required: true
              description: Seconds to wait before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: RATE_LIMITED
                  message: Rate limit exceeded — retry after the delay in the `Retry-After` header.
  '/data/companies/{id}/valuations':
    get:
      operationId: companyValuations
      security:
        - oauth2:
            - 'read:entities'
        - bearerAuth:
            - 'read:entities'
      tags:
        - Companies
      summary: List valuations
      description: >-
        Valuation history (one row per recorded year/month) for a company. The `value` field converts to the requested `?currency=` (default USD).
      parameters:
        - schema:
            type: string
            minLength: 1
            format: uuid
            example: 345d1ab6-33df-4759-9e17-0d0c0ec9ab1c
            description: Stable UUID of the entity. Numeric ids are not accepted.
          required: true
          description: Stable UUID of the entity. Numeric ids are not accepted.
          name: id
          in: path
        - schema:
            type: integer
            format: int32
            minimum: 1
            maximum: 500
            default: 100
            description: 'Number of results to return (1-500, default 100)'
            example: 100
          required: false
          description: 'Number of results to return (1-500, default 100)'
          name: limit
          in: query
        - schema:
            type: integer
            format: int32
            minimum: 0
            default: 0
            description: >-
              Number of results to skip before returning data. Combine with `limit` for offset-based pagination.
            example: 0
          required: false
          description: >-
            Number of results to skip before returning data. Combine with `limit` for offset-based pagination.
          name: offset
          in: query
        - schema:
            type: string
            description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
            example: EUR
          required: false
          description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
          name: currency
          in: query
        - $ref: '#/components/parameters/ApiVersion'
      responses:
        '200':
          description: Company valuations
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EntityValuationsResponse'
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '400':
          description: Invalid entity ID
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: VALIDATION_ERROR
                  message: The request was malformed or failed validation.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '401':
          description: >-
            Authentication required. The `Authorization` header was missing, the bearer token was malformed, or the token failed signature / expiry validation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: UNAUTHORIZED
                  message: Authentication required — provide a valid bearer token.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '403':
          description: >-
            Authentication succeeded but the caller's token does not include the permission required for this operation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FORBIDDEN
                  message: You do not have permission to perform this action.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '429':
          description: Rate limit exceeded.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
            Retry-After:
              schema:
                type: string
                description: Seconds to wait before retrying.
                example: '1'
              required: true
              description: Seconds to wait before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: RATE_LIMITED
                  message: Rate limit exceeded — retry after the delay in the `Retry-After` header.
  '/data/companies/{id}/investors':
    get:
      operationId: companyInvestors
      security:
        - oauth2:
            - 'read:entities'
        - bearerAuth:
            - 'read:entities'
      tags:
        - Companies
      summary: List investors
      description: >-
        Investors that invested in the company, de-duplicated to one row per investor with their aggregate involvement. Includes investors not attributed to any disclosed round (`rounds_count: 0`); pass `?scope=additional` to fetch only those (they sort last, so large round-investor lists otherwise push them past the page limit). Supports the same entity `?filter[...]` DSL as `/data/investors`.
      parameters:
        - schema:
            type: string
            minLength: 1
            format: uuid
            example: 345d1ab6-33df-4759-9e17-0d0c0ec9ab1c
            description: Stable UUID of the entity. Numeric ids are not accepted.
          required: true
          description: Stable UUID of the entity. Numeric ids are not accepted.
          name: id
          in: path
        - schema:
            type: string
            description: |
              Filter expression for the investors — same syntax and keys as /data/investors.

              Operators: eq, neq, gt, gte, lt, lte, in_any, nin_any
              Default ref: 'entity'
            example: 'investor_type[eq]:venture_capital'
          required: false
          description: |
            Filter expression for the investors — same syntax and keys as /data/investors.

            Operators: eq, neq, gt, gte, lt, lte, in_any, nin_any
            Default ref: 'entity'
          name: filter
          in: query
        - schema:
            type: integer
            format: int32
            minimum: 1
            maximum: 500
            default: 25
            description: 'Number of results to return (1-500, default 25)'
            example: 25
          required: false
          description: 'Number of results to return (1-500, default 25)'
          name: limit
          in: query
        - schema:
            type: integer
            format: int32
            minimum: 0
            default: 0
            description: >-
              Number of results to skip before returning data. Combine with `limit` for offset-based pagination.
            example: 0
          required: false
          description: >-
            Number of results to skip before returning data. Combine with `limit` for offset-based pagination.
          name: offset
          in: query
        - schema:
            type: boolean
            description: >-
              Pass `true` to include `page.total` (the matching record count) in the response. Default omits the total to avoid a count query.
            example: true
          required: false
          description: >-
            Pass `true` to include `page.total` (the matching record count) in the response. Default omits the total to avoid a count query.
          name: include_total
          in: query
        - schema:
            type: string
            description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
            example: EUR
          required: false
          description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
          name: currency
          in: query
        - schema:
            type: string
            enum:
              - all
              - rounds
              - additional
            description: >-
              Which investors to return. `all` (default) returns every investor; `rounds` returns only round participants (`rounds_count > 0`); `additional` returns only investors not attributed to any disclosed round (`rounds_count: 0`). Use `additional` to fetch the profile strip without paginating past a large round-investor list.
            example: additional
          required: false
          description: >-
            Which investors to return. `all` (default) returns every investor; `rounds` returns only round participants (`rounds_count > 0`); `additional` returns only investors not attributed to any disclosed round (`rounds_count: 0`). Use `additional` to fetch the profile strip without paginating past a large round-investor list.
          name: scope
          in: query
        - $ref: '#/components/parameters/ApiVersion'
      responses:
        '200':
          description: Company investors
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EntityInvestorsResponse'
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '400':
          description: Invalid entity ID
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: VALIDATION_ERROR
                  message: The request was malformed or failed validation.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '401':
          description: >-
            Authentication required. The `Authorization` header was missing, the bearer token was malformed, or the token failed signature / expiry validation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: UNAUTHORIZED
                  message: Authentication required — provide a valid bearer token.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '403':
          description: >-
            Authentication succeeded but the caller's token does not include the permission required for this operation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FORBIDDEN
                  message: You do not have permission to perform this action.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '429':
          description: Rate limit exceeded.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
            Retry-After:
              schema:
                type: string
                description: Seconds to wait before retrying.
                example: '1'
              required: true
              description: Seconds to wait before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: RATE_LIMITED
                  message: Rate limit exceeded — retry after the delay in the `Retry-After` header.
  '/data/companies/{id}/financials':
    get:
      operationId: companyFinancials
      security:
        - oauth2:
            - 'read:entities'
        - bearerAuth:
            - 'read:entities'
      tags:
        - Companies
      summary: Get financials
      description: >-
        > ⚠ **DATA INCOMPLETE** — `profit` and `rnd` come from company filings (legacy `bobjects_financials` types 8 and 22), concentrated in companies with public annual reports. Measured coverage (2026-08-04): profit ~119k companies (slightly more than EBITDA's ~89k, well below revenue's ~295k); R&D ~19k companies. (ENG-320)


        One row per recorded year of revenue, EBITDA, profit, R&D spend, valuation, and employee count. Monetary values convert to the requested `?currency=` (default USD).
      parameters:
        - schema:
            type: string
            minLength: 1
            format: uuid
            example: 345d1ab6-33df-4759-9e17-0d0c0ec9ab1c
            description: Stable UUID of the entity. Numeric ids are not accepted.
          required: true
          description: Stable UUID of the entity. Numeric ids are not accepted.
          name: id
          in: path
        - schema:
            type: string
            description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
            example: EUR
          required: false
          description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
          name: currency
          in: query
        - $ref: '#/components/parameters/ApiVersion'
      responses:
        '200':
          description: Company financials by year
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EntityFinancialsResponse'
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '400':
          description: Invalid entity ID
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: VALIDATION_ERROR
                  message: The request was malformed or failed validation.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '401':
          description: >-
            Authentication required. The `Authorization` header was missing, the bearer token was malformed, or the token failed signature / expiry validation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: UNAUTHORIZED
                  message: Authentication required — provide a valid bearer token.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '403':
          description: >-
            Authentication succeeded but the caller's token does not include the permission required for this operation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FORBIDDEN
                  message: You do not have permission to perform this action.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '429':
          description: Rate limit exceeded.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
            Retry-After:
              schema:
                type: string
                description: Seconds to wait before retrying.
                example: '1'
              required: true
              description: Seconds to wait before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: RATE_LIMITED
                  message: Rate limit exceeded — retry after the delay in the `Retry-After` header.
      x-data-status:
        kind: data-incomplete
        gapId: financials-profit-rnd-sparse
        reason: >-
          `profit` and `rnd` come from company filings (legacy `bobjects_financials` types 8 and 22), concentrated in companies with public annual reports. Measured coverage (2026-08-04): profit ~119k companies (slightly more than EBITDA's ~89k, well below revenue's ~295k); R&D ~19k companies.
        observable: >-
          `rnd` is NULL for the vast majority of companies; `profit` coverage is comparable to `ebitda` — both a small fraction of all companies and well below revenue.
        ticket: ENG-320
  '/data/companies/{id}/web-traffic':
    get:
      operationId: companyWebTraffic
      security:
        - oauth2:
            - 'read:entities'
        - bearerAuth:
            - 'read:entities'
      tags:
        - Companies
      summary: Get web traffic
      description: >-
        Full monthly web-visit estimate series for a company, ordered chronologically (oldest first) — the data behind the web-traffic trend chart on the company profile. Visit counts are SimilarWeb-derived estimates. Returns an empty list for companies with no recorded traffic.
      parameters:
        - schema:
            type: string
            minLength: 1
            format: uuid
            example: 345d1ab6-33df-4759-9e17-0d0c0ec9ab1c
            description: Stable UUID of the entity. Numeric ids are not accepted.
          required: true
          description: Stable UUID of the entity. Numeric ids are not accepted.
          name: id
          in: path
        - $ref: '#/components/parameters/ApiVersion'
      responses:
        '200':
          description: Company monthly web-traffic series
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EntityWebTrafficResponse'
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '400':
          description: Invalid entity ID
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: VALIDATION_ERROR
                  message: The request was malformed or failed validation.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '401':
          description: >-
            Authentication required. The `Authorization` header was missing, the bearer token was malformed, or the token failed signature / expiry validation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: UNAUTHORIZED
                  message: Authentication required — provide a valid bearer token.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '403':
          description: >-
            Authentication succeeded but the caller's token does not include the permission required for this operation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FORBIDDEN
                  message: You do not have permission to perform this action.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '429':
          description: Rate limit exceeded.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
            Retry-After:
              schema:
                type: string
                description: Seconds to wait before retrying.
                example: '1'
              required: true
              description: Seconds to wait before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: RATE_LIMITED
                  message: Rate limit exceeded — retry after the delay in the `Retry-After` header.
  '/data/companies/{id}/headcount-breakdown':
    get:
      operationId: companyHeadcountBreakdown
      security:
        - oauth2:
            - 'read:entities'
        - bearerAuth:
            - 'read:entities'
      tags:
        - Companies
      summary: Get headcount breakdown
      description: >-
        Full monthly employee-distribution series for a company across both breakdown dimensions — `country` (employee distribution by country) and `department` — ordered chronologically (oldest first). Each row is one item's percentage share of headcount for a month. Narrow to a single dimension with `?type=country|department`. Powers the headcount donut and stacked-area charts on the company profile. Returns an empty list for companies with no recorded breakdown.
      parameters:
        - schema:
            type: string
            minLength: 1
            format: uuid
            example: 345d1ab6-33df-4759-9e17-0d0c0ec9ab1c
            description: Stable UUID of the entity. Numeric ids are not accepted.
          required: true
          description: Stable UUID of the entity. Numeric ids are not accepted.
          name: id
          in: path
        - schema:
            type: string
            enum:
              - country
              - department
            description: >-
              Restrict to a single breakdown dimension: `country` (employee distribution by country) or `department`. Omit to return both.
            example: country
          required: false
          description: >-
            Restrict to a single breakdown dimension: `country` (employee distribution by country) or `department`. Omit to return both.
          name: type
          in: query
        - $ref: '#/components/parameters/ApiVersion'
      responses:
        '200':
          description: Company monthly headcount breakdown series
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EntityHeadcountBreakdownResponse'
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '400':
          description: Invalid entity ID
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: VALIDATION_ERROR
                  message: The request was malformed or failed validation.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '401':
          description: >-
            Authentication required. The `Authorization` header was missing, the bearer token was malformed, or the token failed signature / expiry validation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: UNAUTHORIZED
                  message: Authentication required — provide a valid bearer token.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '403':
          description: >-
            Authentication succeeded but the caller's token does not include the permission required for this operation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FORBIDDEN
                  message: You do not have permission to perform this action.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '422':
          description: Validation error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FILTER_PARSE_ERROR
                  message: >-
                    The request could not be processed — check the filter syntax and any identifiers.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '429':
          description: Rate limit exceeded.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
            Retry-After:
              schema:
                type: string
                description: Seconds to wait before retrying.
                example: '1'
              required: true
              description: Seconds to wait before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: RATE_LIMITED
                  message: Rate limit exceeded — retry after the delay in the `Retry-After` header.
  '/data/companies/{id}/team':
    get:
      operationId: companyTeam
      security:
        - oauth2:
            - 'read:entities'
            - 'read:people'
        - bearerAuth:
            - 'read:entities'
            - 'read:people'
      tags:
        - Companies
      summary: List company team members
      description: >-
        People associated with the company through the people_entities relationship (founders, executives, partners, and other team members). Supports the same person filter DSL as `/data/people`, plus `role` and `is_past` relationship filters.
      parameters:
        - schema:
            type: string
            minLength: 1
            format: uuid
            example: 345d1ab6-33df-4759-9e17-0d0c0ec9ab1c
            description: Stable UUID of the entity. Numeric ids are not accepted.
          required: true
          description: Stable UUID of the entity. Numeric ids are not accepted.
          name: id
          in: path
        - schema:
            type: string
            description: |
              Filter expression for team members — same syntax and keys as /data/people.

              Examples:
              - Single: hq_location[eq]:233
              - AND: and(hq_location[eq]:233,gender[eq]:female)

              Operators: eq, neq, gt, gte, lt, lte, in_any, nin_any
              Default ref: 'entity'
            example: 'gender[eq]:female'
          required: false
          description: |
            Filter expression for team members — same syntax and keys as /data/people.

            Examples:
            - Single: hq_location[eq]:233
            - AND: and(hq_location[eq]:233,gender[eq]:female)

            Operators: eq, neq, gt, gte, lt, lte, in_any, nin_any
            Default ref: 'entity'
          name: filter
          in: query
        - schema:
            type: integer
            format: int32
            minimum: 1
            maximum: 500
            default: 25
            description: 'Number of results to return (1-500, default 25)'
            example: 25
          required: false
          description: 'Number of results to return (1-500, default 25)'
          name: limit
          in: query
        - schema:
            type: integer
            format: int32
            minimum: 0
            default: 0
            description: >-
              Number of results to skip before returning data. Combine with `limit` for offset-based pagination.
            example: 0
          required: false
          description: >-
            Number of results to skip before returning data. Combine with `limit` for offset-based pagination.
          name: offset
          in: query
        - schema:
            type: string
            pattern: '^-?[\w,]+$'
            description: >-
              Sort by one or more keys. Prefix with `-` for descending order; comma-separated for multi-key sorts.
            example: name
          required: false
          description: >-
            Sort by one or more keys. Prefix with `-` for descending order; comma-separated for multi-key sorts.
          name: sort
          in: query
        - schema:
            type: boolean
            description: >-
              Pass `true` to include `page.total` (the matching record count) in the response. Default omits the total to avoid a count query.
            example: true
          required: false
          description: >-
            Pass `true` to include `page.total` (the matching record count) in the response. Default omits the total to avoid a count query.
          name: include_total
          in: query
        - schema:
            type: string
            description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
            example: EUR
          required: false
          description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
          name: currency
          in: query
        - schema:
            type: string
            enum:
              - founder
              - executive
              - partner
            description: >-
              Restrict to a single relationship role at this entity: `founder`, `executive`, or `partner`. Omit to include everyone.
            example: founder
          required: false
          description: >-
            Restrict to a single relationship role at this entity: `founder`, `executive`, or `partner`. Omit to include everyone.
          name: role
          in: query
        - schema:
            type: boolean
            description: >-
              Filter by tenure at this entity. `false` = current members, `true` = former members. Omit to include both.
            example: false
          required: false
          description: >-
            Filter by tenure at this entity. `false` = current members, `true` = former members. Omit to include both.
          name: is_past
          in: query
        - $ref: '#/components/parameters/ApiVersion'
      responses:
        '200':
          description: Company team members
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EntityTeamResponse'
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '400':
          description: Invalid entity ID
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: VALIDATION_ERROR
                  message: The request was malformed or failed validation.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '401':
          description: >-
            Authentication required. The `Authorization` header was missing, the bearer token was malformed, or the token failed signature / expiry validation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: UNAUTHORIZED
                  message: Authentication required — provide a valid bearer token.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '403':
          description: >-
            Authentication succeeded but the caller's token does not include the permission required for this operation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FORBIDDEN
                  message: You do not have permission to perform this action.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '422':
          description: Validation error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FILTER_PARSE_ERROR
                  message: >-
                    The request could not be processed — check the filter syntax and any identifiers.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '429':
          description: Rate limit exceeded.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
            Retry-After:
              schema:
                type: string
                description: Seconds to wait before retrying.
                example: '1'
              required: true
              description: Seconds to wait before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: RATE_LIMITED
                  message: Rate limit exceeded — retry after the delay in the `Retry-After` header.
  '/data/companies/{id}/similar':
    get:
      operationId: companySimilar
      security:
        - oauth2:
            - 'read:entities'
        - bearerAuth:
            - 'read:entities'
      tags:
        - Companies
      summary: List similar companies
      description: >-
        Companies ranked by similarity to this company, scored by weighted overlap of shared categorical tags (sector, sub-industry, industry, client focus, technology, income stream) — the legacy app.dealroom.co similar-companies model. Force-sorted by score; supports the full company filter DSL to narrow the candidate pool (e.g. by location). Offset pagination, capped at offset+limit ≤ 1000.
      parameters:
        - schema:
            type: string
            minLength: 1
            format: uuid
            example: 345d1ab6-33df-4759-9e17-0d0c0ec9ab1c
            description: Stable UUID of the entity. Numeric ids are not accepted.
          required: true
          description: Stable UUID of the entity. Numeric ids are not accepted.
          name: id
          in: path
        - schema:
            type: string
            description: |
              Filter expression for companies (organization_subtype = company) using nested syntax.

              Examples:
              - Single: total_funding[gte]:1000000
              - AND: and(total_funding[gte]:1000000,is_unicorn[eq]:true)
              - OR: or(hq_location[eq]:628061,hq_location[eq]:1297711)
              - Relationship path: investor.total_invested_usd[gte]:100000000

              Operators: eq, neq, gt, gte, lt, lte, in_any, nin_any
              in_all / nin_all are only available on repeated related-record filters.
              Default ref: 'entity' (can be omitted for entity filters)
            example: 'and(total_funding[gte]:1000000,is_unicorn[eq]:true)'
          required: false
          description: |
            Filter expression for companies (organization_subtype = company) using nested syntax.

            Examples:
            - Single: total_funding[gte]:1000000
            - AND: and(total_funding[gte]:1000000,is_unicorn[eq]:true)
            - OR: or(hq_location[eq]:628061,hq_location[eq]:1297711)
            - Relationship path: investor.total_invested_usd[gte]:100000000

            Operators: eq, neq, gt, gte, lt, lte, in_any, nin_any
            in_all / nin_all are only available on repeated related-record filters.
            Default ref: 'entity' (can be omitted for entity filters)
          name: filter
          in: query
        - schema:
            type: integer
            format: int32
            minimum: 1
            maximum: 500
            default: 25
            description: 'Number of results to return (1-500, default 25)'
            example: 25
          required: false
          description: 'Number of results to return (1-500, default 25)'
          name: limit
          in: query
        - schema:
            type: integer
            format: int32
            minimum: 0
            default: 0
            description: >-
              Number of results to skip before returning data. Combine with `limit` for offset-based pagination.
            example: 0
          required: false
          description: >-
            Number of results to skip before returning data. Combine with `limit` for offset-based pagination.
          name: offset
          in: query
        - schema:
            type: string
            pattern: '^-?[\w,]+$'
            description: >-
              Sort by one or more keys. Prefix with `-` for descending order; comma-separated for multi-key sorts.
            example: '-launch_date'
          required: false
          description: >-
            Sort by one or more keys. Prefix with `-` for descending order; comma-separated for multi-key sorts.
          name: sort
          in: query
        - schema:
            type: boolean
            description: >-
              Pass `true` to include `page.total` (the matching record count) in the response. Default omits the total to avoid a count query.
            example: true
          required: false
          description: >-
            Pass `true` to include `page.total` (the matching record count) in the response. Default omits the total to avoid a count query.
          name: include_total
          in: query
        - schema:
            type: string
            description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
            example: EUR
          required: false
          description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
          name: currency
          in: query
        - $ref: '#/components/parameters/ApiVersion'
      responses:
        '200':
          description: Similar companies
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CompanyListResponse'
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '400':
          description: >-
            Invalid request — e.g. malformed entity id, or offset+limit beyond the similarity window cap (1000)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: VALIDATION_ERROR
                  message: The request was malformed or failed validation.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '401':
          description: >-
            Authentication required. The `Authorization` header was missing, the bearer token was malformed, or the token failed signature / expiry validation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: UNAUTHORIZED
                  message: Authentication required — provide a valid bearer token.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '403':
          description: >-
            Authentication succeeded but the caller's token does not include the permission required for this operation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FORBIDDEN
                  message: You do not have permission to perform this action.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '404':
          description: Anchor entity not found in this collection
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: NOT_FOUND
                  message: The requested resource was not found.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '422':
          description: Validation error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FILTER_PARSE_ERROR
                  message: >-
                    The request could not be processed — check the filter syntax and any identifiers.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '429':
          description: Rate limit exceeded.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
            Retry-After:
              schema:
                type: string
                description: Seconds to wait before retrying.
                example: '1'
              required: true
              description: Seconds to wait before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: RATE_LIMITED
                  message: Rate limit exceeded — retry after the delay in the `Retry-After` header.
  /data/universities:
    get:
      operationId: listUniversities
      security:
        - oauth2:
            - 'read:entities'
        - bearerAuth:
            - 'read:entities'
      tags:
        - Universities
      summary: List universities
      description: >-
        Returns a paginated list of universities (entities with `organization_subtype = university`). The `university` sub-object carries alumni metrics (founder count, founded/unicorn companies). Supports the full entity filter syntax, sorting, and pagination.
      parameters:
        - schema:
            type: string
            description: >
              Filter expression for universities (organization_subtype = university) using nested syntax.


              Examples:

              - Single: alumni_founder_count[gte]:100

              - AND: and(alumni_founder_count[gte]:100,hq_location[eq]:233)


              Operators: eq, neq, gt, gte, lt, lte, in_any, nin_any

              Default ref: 'entity' (can be omitted for entity filters)

            example: 'and(alumni_founder_count[gte]:100,hq_location[eq]:233)'
          required: false
          description: >
            Filter expression for universities (organization_subtype = university) using nested syntax.


            Examples:

            - Single: alumni_founder_count[gte]:100

            - AND: and(alumni_founder_count[gte]:100,hq_location[eq]:233)


            Operators: eq, neq, gt, gte, lt, lte, in_any, nin_any

            Default ref: 'entity' (can be omitted for entity filters)

          name: filter
          in: query
        - schema:
            type: integer
            format: int32
            minimum: 1
            maximum: 500
            default: 25
            description: 'Number of results to return (1-500, default 25)'
            example: 25
          required: false
          description: 'Number of results to return (1-500, default 25)'
          name: limit
          in: query
        - schema:
            type: integer
            format: int32
            minimum: 0
            default: 0
            description: >-
              Number of results to skip before returning data. Combine with `limit` for offset-based pagination.
            example: 0
          required: false
          description: >-
            Number of results to skip before returning data. Combine with `limit` for offset-based pagination.
          name: offset
          in: query
        - schema:
            type: string
            description: >-
              Opaque cursor token from a previous response's `page.next_cursor` or `page.prev_cursor`. Round-trip it as-is — do not decode or modify.
            example: eyJ2IjoxLCJkIjoibmV4dCJ9
          required: false
          description: >-
            Opaque cursor token from a previous response's `page.next_cursor` or `page.prev_cursor`. Round-trip it as-is — do not decode or modify.
          name: cursor
          in: query
        - schema:
            type: string
            pattern: '^-?[\w,]+$'
            description: >-
              Sort by one or more keys. Prefix with `-` for descending order; comma-separated for multi-key sorts.
            example: '-launch_date'
          required: false
          description: >-
            Sort by one or more keys. Prefix with `-` for descending order; comma-separated for multi-key sorts.
          name: sort
          in: query
        - schema:
            type: boolean
            description: >-
              Pass `true` to include `page.total` (the matching record count) in the response. Default omits the total to avoid a count query.
            example: true
          required: false
          description: >-
            Pass `true` to include `page.total` (the matching record count) in the response. Default omits the total to avoid a count query.
          name: include_total
          in: query
        - schema:
            type: string
            description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
            example: EUR
          required: false
          description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
          name: currency
          in: query
        - $ref: '#/components/parameters/ApiVersion'
      responses:
        '200':
          description: List of universities
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UniversityListResponse'
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '401':
          description: >-
            Authentication required. The `Authorization` header was missing, the bearer token was malformed, or the token failed signature / expiry validation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: UNAUTHORIZED
                  message: Authentication required — provide a valid bearer token.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '403':
          description: >-
            Authentication succeeded but the caller's token does not include the permission required for this operation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FORBIDDEN
                  message: You do not have permission to perform this action.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '422':
          description: Validation error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FILTER_PARSE_ERROR
                  message: >-
                    The request could not be processed — check the filter syntax and any identifiers.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '429':
          description: Rate limit exceeded.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
            Retry-After:
              schema:
                type: string
                description: Seconds to wait before retrying.
                example: '1'
              required: true
              description: Seconds to wait before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: RATE_LIMITED
                  message: Rate limit exceeded — retry after the delay in the `Retry-After` header.
  /data/universities/geo:
    get:
      operationId: listUniversityGeoPoints
      security:
        - oauth2:
            - 'read:entities'
        - bearerAuth:
            - 'read:entities'
      tags:
        - Universities
      summary: List university map points
      description: >-
        Slim university payload for map rendering (the startup map's dot layer): one point per university with HQ coordinates and an optional `size_by` metric value. Accepts the same filter syntax as `/universities`. When `size_by` is set, points sort by that dimension descending, so capped responses keep the highest-value points. Universities without usable HQ coordinates are omitted. Monetary values are USD. For per-area counts (the map's choropleth layer), use the aggregate endpoint over the entities source narrowed to the subtype: GET /analytics/aggregate/entities?metric=count&group_by=map_area&filter=organization_subtype[eq]:university.
      parameters:
        - schema:
            type: string
            description: >-
              Filter expression for universities — identical syntax and semantics to the `/universities` list filter.
            example: 'and(alumni_founder_count[gte]:100,hq_location[eq]:233)'
          required: false
          description: >-
            Filter expression for universities — identical syntax and semantics to the `/universities` list filter.
          name: filter
          in: query
        - schema:
            type: string
            enum:
              - total_funding
              - employee_count
              - latest_valuation
              - total_invested
              - total_investments_count
              - alumni_count
              - alumni_founder_count
            description: >-
              Numeric dimension returned as each point's `value` (for proportional dot sizing). Monetary dimensions are USD. Also sorts the result descending, so a capped response keeps the highest-value points. Omitted → `value` is null and the default sort applies.
            example: total_funding
          required: false
          description: >-
            Numeric dimension returned as each point's `value` (for proportional dot sizing). Monetary dimensions are USD. Also sorts the result descending, so a capped response keeps the highest-value points. Omitted → `value` is null and the default sort applies.
          name: size_by
          in: query
        - schema:
            type: integer
            format: int32
            minimum: 1
            maximum: 5000
            default: 5000
            description: 'Number of results to return (1-5000, default 5000)'
            example: 5000
          required: false
          description: 'Number of results to return (1-5000, default 5000)'
          name: limit
          in: query
        - schema:
            type: integer
            format: int32
            minimum: 0
            default: 0
            description: >-
              Number of results to skip before returning data. Combine with `limit` for offset-based pagination.
            example: 0
          required: false
          description: >-
            Number of results to skip before returning data. Combine with `limit` for offset-based pagination.
          name: offset
          in: query
        - $ref: '#/components/parameters/ApiVersion'
      responses:
        '200':
          description: University map points
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UniversityGeoResponse'
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '401':
          description: >-
            Authentication required. The `Authorization` header was missing, the bearer token was malformed, or the token failed signature / expiry validation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: UNAUTHORIZED
                  message: Authentication required — provide a valid bearer token.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '403':
          description: >-
            Authentication succeeded but the caller's token does not include the permission required for this operation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FORBIDDEN
                  message: You do not have permission to perform this action.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '422':
          description: Validation error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FILTER_PARSE_ERROR
                  message: >-
                    The request could not be processed — check the filter syntax and any identifiers.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '429':
          description: Rate limit exceeded.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
            Retry-After:
              schema:
                type: string
                description: Seconds to wait before retrying.
                example: '1'
              required: true
              description: Seconds to wait before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: RATE_LIMITED
                  message: Rate limit exceeded — retry after the delay in the `Retry-After` header.
  '/data/universities/{id}':
    get:
      operationId: getUniversity
      security:
        - oauth2:
            - 'read:entities'
        - bearerAuth:
            - 'read:entities'
      tags:
        - Universities
      summary: Get single university
      description: >-
        Returns the full university record by UUID (numeric IDs are not accepted), including the `university` sub-object (alumni metrics) alongside the shared entity base fields.
      parameters:
        - schema:
            type: string
            minLength: 1
            format: uuid
            example: 345d1ab6-33df-4759-9e17-0d0c0ec9ab1c
            description: Stable UUID of the entity. Numeric ids are not accepted.
          required: true
          description: Stable UUID of the entity. Numeric ids are not accepted.
          name: id
          in: path
        - schema:
            type: string
            description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
            example: EUR
          required: false
          description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
          name: currency
          in: query
        - $ref: '#/components/parameters/ApiVersion'
      responses:
        '200':
          description: Single university
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UniversityDetailResponse'
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '401':
          description: >-
            Authentication required. The `Authorization` header was missing, the bearer token was malformed, or the token failed signature / expiry validation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: UNAUTHORIZED
                  message: Authentication required — provide a valid bearer token.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '403':
          description: >-
            Authentication succeeded but the caller's token does not include the permission required for this operation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FORBIDDEN
                  message: You do not have permission to perform this action.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '404':
          description: University not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: NOT_FOUND
                  message: The requested resource was not found.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '429':
          description: Rate limit exceeded.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
            Retry-After:
              schema:
                type: string
                description: Seconds to wait before retrying.
                example: '1'
              required: true
              description: Seconds to wait before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: RATE_LIMITED
                  message: Rate limit exceeded — retry after the delay in the `Retry-After` header.
  '/data/universities/{id}/team':
    get:
      operationId: universityTeam
      security:
        - oauth2:
            - 'read:entities'
            - 'read:people'
        - bearerAuth:
            - 'read:entities'
            - 'read:people'
      tags:
        - Universities
      summary: List university team members
      description: >-
        People associated with the university through the people_entities relationship. Supports the same person filter DSL as `/data/people`, plus `role` and `is_past` relationship filters.
      parameters:
        - schema:
            type: string
            minLength: 1
            format: uuid
            example: 345d1ab6-33df-4759-9e17-0d0c0ec9ab1c
            description: Stable UUID of the entity. Numeric ids are not accepted.
          required: true
          description: Stable UUID of the entity. Numeric ids are not accepted.
          name: id
          in: path
        - schema:
            type: string
            description: |
              Filter expression for team members — same syntax and keys as /data/people.

              Examples:
              - Single: hq_location[eq]:233
              - AND: and(hq_location[eq]:233,gender[eq]:female)

              Operators: eq, neq, gt, gte, lt, lte, in_any, nin_any
              Default ref: 'entity'
            example: 'gender[eq]:female'
          required: false
          description: |
            Filter expression for team members — same syntax and keys as /data/people.

            Examples:
            - Single: hq_location[eq]:233
            - AND: and(hq_location[eq]:233,gender[eq]:female)

            Operators: eq, neq, gt, gte, lt, lte, in_any, nin_any
            Default ref: 'entity'
          name: filter
          in: query
        - schema:
            type: integer
            format: int32
            minimum: 1
            maximum: 500
            default: 25
            description: 'Number of results to return (1-500, default 25)'
            example: 25
          required: false
          description: 'Number of results to return (1-500, default 25)'
          name: limit
          in: query
        - schema:
            type: integer
            format: int32
            minimum: 0
            default: 0
            description: >-
              Number of results to skip before returning data. Combine with `limit` for offset-based pagination.
            example: 0
          required: false
          description: >-
            Number of results to skip before returning data. Combine with `limit` for offset-based pagination.
          name: offset
          in: query
        - schema:
            type: string
            pattern: '^-?[\w,]+$'
            description: >-
              Sort by one or more keys. Prefix with `-` for descending order; comma-separated for multi-key sorts.
            example: name
          required: false
          description: >-
            Sort by one or more keys. Prefix with `-` for descending order; comma-separated for multi-key sorts.
          name: sort
          in: query
        - schema:
            type: boolean
            description: >-
              Pass `true` to include `page.total` (the matching record count) in the response. Default omits the total to avoid a count query.
            example: true
          required: false
          description: >-
            Pass `true` to include `page.total` (the matching record count) in the response. Default omits the total to avoid a count query.
          name: include_total
          in: query
        - schema:
            type: string
            description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
            example: EUR
          required: false
          description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
          name: currency
          in: query
        - schema:
            type: string
            enum:
              - founder
              - executive
              - partner
            description: >-
              Restrict to a single relationship role at this entity: `founder`, `executive`, or `partner`. Omit to include everyone.
            example: founder
          required: false
          description: >-
            Restrict to a single relationship role at this entity: `founder`, `executive`, or `partner`. Omit to include everyone.
          name: role
          in: query
        - schema:
            type: boolean
            description: >-
              Filter by tenure at this entity. `false` = current members, `true` = former members. Omit to include both.
            example: false
          required: false
          description: >-
            Filter by tenure at this entity. `false` = current members, `true` = former members. Omit to include both.
          name: is_past
          in: query
        - $ref: '#/components/parameters/ApiVersion'
      responses:
        '200':
          description: University team members
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EntityTeamResponse'
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '400':
          description: Invalid entity ID
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: VALIDATION_ERROR
                  message: The request was malformed or failed validation.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '401':
          description: >-
            Authentication required. The `Authorization` header was missing, the bearer token was malformed, or the token failed signature / expiry validation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: UNAUTHORIZED
                  message: Authentication required — provide a valid bearer token.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '403':
          description: >-
            Authentication succeeded but the caller's token does not include the permission required for this operation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FORBIDDEN
                  message: You do not have permission to perform this action.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '422':
          description: Validation error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FILTER_PARSE_ERROR
                  message: >-
                    The request could not be processed — check the filter syntax and any identifiers.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '429':
          description: Rate limit exceeded.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
            Retry-After:
              schema:
                type: string
                description: Seconds to wait before retrying.
                example: '1'
              required: true
              description: Seconds to wait before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: RATE_LIMITED
                  message: Rate limit exceeded — retry after the delay in the `Retry-After` header.
  '/data/universities/{id}/alumni':
    get:
      operationId: universityAlumni
      security:
        - oauth2:
            - 'read:entities'
            - 'read:people'
        - bearerAuth:
            - 'read:entities'
            - 'read:people'
      tags:
        - Universities
      summary: List alumni
      description: >-
        People who studied at the university (via people_education), one row per alum with the degree(s) earned and study years here, most recent first. Founder alumni carry `is_founder: true` so callers can surface them. Supports the same person filter DSL as `/data/people`.
      parameters:
        - schema:
            type: string
            minLength: 1
            format: uuid
            example: 345d1ab6-33df-4759-9e17-0d0c0ec9ab1c
            description: Stable UUID of the entity. Numeric ids are not accepted.
          required: true
          description: Stable UUID of the entity. Numeric ids are not accepted.
          name: id
          in: path
        - schema:
            type: string
            description: |
              Filter expression for alumni — same syntax and keys as /data/people.

              Examples:
              - Single: gender[eq]:female
              - AND: and(gender[eq]:female,hq_location[eq]:233)

              Operators: eq, neq, gt, gte, lt, lte, in_any, nin_any
              Default ref: 'entity'
            example: 'gender[eq]:female'
          required: false
          description: |
            Filter expression for alumni — same syntax and keys as /data/people.

            Examples:
            - Single: gender[eq]:female
            - AND: and(gender[eq]:female,hq_location[eq]:233)

            Operators: eq, neq, gt, gte, lt, lte, in_any, nin_any
            Default ref: 'entity'
          name: filter
          in: query
        - schema:
            type: integer
            format: int32
            minimum: 1
            maximum: 500
            default: 25
            description: 'Number of results to return (1-500, default 25)'
            example: 25
          required: false
          description: 'Number of results to return (1-500, default 25)'
          name: limit
          in: query
        - schema:
            type: integer
            format: int32
            minimum: 0
            default: 0
            description: >-
              Number of results to skip before returning data. Combine with `limit` for offset-based pagination.
            example: 0
          required: false
          description: >-
            Number of results to skip before returning data. Combine with `limit` for offset-based pagination.
          name: offset
          in: query
        - schema:
            type: string
            pattern: '^-?[\w,]+$'
            description: >-
              Sort by one or more keys. Prefix with `-` for descending order; comma-separated for multi-key sorts.
            example: name
          required: false
          description: >-
            Sort by one or more keys. Prefix with `-` for descending order; comma-separated for multi-key sorts.
          name: sort
          in: query
        - schema:
            type: boolean
            description: >-
              Pass `true` to include `page.total` (the matching record count) in the response. Default omits the total to avoid a count query.
            example: true
          required: false
          description: >-
            Pass `true` to include `page.total` (the matching record count) in the response. Default omits the total to avoid a count query.
          name: include_total
          in: query
        - schema:
            type: string
            description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
            example: EUR
          required: false
          description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
          name: currency
          in: query
        - $ref: '#/components/parameters/ApiVersion'
      responses:
        '200':
          description: University alumni
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UniversityAlumniResponse'
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '400':
          description: Invalid entity ID
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: VALIDATION_ERROR
                  message: The request was malformed or failed validation.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '401':
          description: >-
            Authentication required. The `Authorization` header was missing, the bearer token was malformed, or the token failed signature / expiry validation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: UNAUTHORIZED
                  message: Authentication required — provide a valid bearer token.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '403':
          description: >-
            Authentication succeeded but the caller's token does not include the permission required for this operation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FORBIDDEN
                  message: You do not have permission to perform this action.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '429':
          description: Rate limit exceeded.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
            Retry-After:
              schema:
                type: string
                description: Seconds to wait before retrying.
                example: '1'
              required: true
              description: Seconds to wait before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: RATE_LIMITED
                  message: Rate limit exceeded — retry after the delay in the `Retry-After` header.
  /data/gov-ngo:
    get:
      operationId: listGovNgo
      security:
        - oauth2:
            - 'read:entities'
        - bearerAuth:
            - 'read:entities'
      tags:
        - Government & NGO
      summary: List government & NGO entities
      description: >-
        Returns a paginated list of government bodies and NGOs (entities with `organization_subtype = gov_ngo`). Supports the full entity filter syntax, sorting, and pagination.
      parameters:
        - schema:
            type: string
            description: |
              Filter expression for government & NGO entities (organization_subtype = gov_ngo)
              using nested syntax.

              Examples:
              - Single: hq_location[eq]:233
              - AND: and(hq_location[eq]:233,launch_date[gte]:2000)

              Operators: eq, neq, gt, gte, lt, lte, in_any, nin_any
              Default ref: 'entity' (can be omitted for entity filters)
            example: 'hq_location[eq]:233'
          required: false
          description: |
            Filter expression for government & NGO entities (organization_subtype = gov_ngo)
            using nested syntax.

            Examples:
            - Single: hq_location[eq]:233
            - AND: and(hq_location[eq]:233,launch_date[gte]:2000)

            Operators: eq, neq, gt, gte, lt, lte, in_any, nin_any
            Default ref: 'entity' (can be omitted for entity filters)
          name: filter
          in: query
        - schema:
            type: integer
            format: int32
            minimum: 1
            maximum: 500
            default: 25
            description: 'Number of results to return (1-500, default 25)'
            example: 25
          required: false
          description: 'Number of results to return (1-500, default 25)'
          name: limit
          in: query
        - schema:
            type: integer
            format: int32
            minimum: 0
            default: 0
            description: >-
              Number of results to skip before returning data. Combine with `limit` for offset-based pagination.
            example: 0
          required: false
          description: >-
            Number of results to skip before returning data. Combine with `limit` for offset-based pagination.
          name: offset
          in: query
        - schema:
            type: string
            description: >-
              Opaque cursor token from a previous response's `page.next_cursor` or `page.prev_cursor`. Round-trip it as-is — do not decode or modify.
            example: eyJ2IjoxLCJkIjoibmV4dCJ9
          required: false
          description: >-
            Opaque cursor token from a previous response's `page.next_cursor` or `page.prev_cursor`. Round-trip it as-is — do not decode or modify.
          name: cursor
          in: query
        - schema:
            type: string
            pattern: '^-?[\w,]+$'
            description: >-
              Sort by one or more keys. Prefix with `-` for descending order; comma-separated for multi-key sorts.
            example: '-launch_date'
          required: false
          description: >-
            Sort by one or more keys. Prefix with `-` for descending order; comma-separated for multi-key sorts.
          name: sort
          in: query
        - schema:
            type: boolean
            description: >-
              Pass `true` to include `page.total` (the matching record count) in the response. Default omits the total to avoid a count query.
            example: true
          required: false
          description: >-
            Pass `true` to include `page.total` (the matching record count) in the response. Default omits the total to avoid a count query.
          name: include_total
          in: query
        - schema:
            type: string
            description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
            example: EUR
          required: false
          description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
          name: currency
          in: query
        - $ref: '#/components/parameters/ApiVersion'
      responses:
        '200':
          description: List of government & NGO entities
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GovNgoListResponse'
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '401':
          description: >-
            Authentication required. The `Authorization` header was missing, the bearer token was malformed, or the token failed signature / expiry validation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: UNAUTHORIZED
                  message: Authentication required — provide a valid bearer token.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '403':
          description: >-
            Authentication succeeded but the caller's token does not include the permission required for this operation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FORBIDDEN
                  message: You do not have permission to perform this action.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '422':
          description: Validation error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FILTER_PARSE_ERROR
                  message: >-
                    The request could not be processed — check the filter syntax and any identifiers.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '429':
          description: Rate limit exceeded.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
            Retry-After:
              schema:
                type: string
                description: Seconds to wait before retrying.
                example: '1'
              required: true
              description: Seconds to wait before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: RATE_LIMITED
                  message: Rate limit exceeded — retry after the delay in the `Retry-After` header.
  /data/gov-ngo/geo:
    get:
      operationId: listGovNgoGeoPoints
      security:
        - oauth2:
            - 'read:entities'
        - bearerAuth:
            - 'read:entities'
      tags:
        - Government & NGO
      summary: List government & NGO map points
      description: >-
        Slim government/NGO payload for map rendering (the startup map's dot layer): one point per entity with HQ coordinates and an optional `size_by` metric value. Accepts the same filter syntax as `/gov-ngo`. When `size_by` is set, points sort by that dimension descending, so capped responses keep the highest-value points. Entities without usable HQ coordinates are omitted. Monetary values are USD. For per-area counts (the map's choropleth layer), use the aggregate endpoint over the entities source narrowed to the subtype: GET /analytics/aggregate/entities?metric=count&group_by=map_area&filter=organization_subtype[eq]:gov_ngo.
      parameters:
        - schema:
            type: string
            description: >-
              Filter expression for government & NGO entities — identical syntax and semantics to the `/gov-ngo` list filter.
            example: 'hq_location[eq]:233'
          required: false
          description: >-
            Filter expression for government & NGO entities — identical syntax and semantics to the `/gov-ngo` list filter.
          name: filter
          in: query
        - schema:
            type: string
            enum:
              - total_funding
              - employee_count
              - latest_valuation
              - total_invested
              - total_investments_count
              - alumni_count
              - alumni_founder_count
            description: >-
              Numeric dimension returned as each point's `value` (for proportional dot sizing). Monetary dimensions are USD. Also sorts the result descending, so a capped response keeps the highest-value points. Omitted → `value` is null and the default sort applies.
            example: total_funding
          required: false
          description: >-
            Numeric dimension returned as each point's `value` (for proportional dot sizing). Monetary dimensions are USD. Also sorts the result descending, so a capped response keeps the highest-value points. Omitted → `value` is null and the default sort applies.
          name: size_by
          in: query
        - schema:
            type: integer
            format: int32
            minimum: 1
            maximum: 5000
            default: 5000
            description: 'Number of results to return (1-5000, default 5000)'
            example: 5000
          required: false
          description: 'Number of results to return (1-5000, default 5000)'
          name: limit
          in: query
        - schema:
            type: integer
            format: int32
            minimum: 0
            default: 0
            description: >-
              Number of results to skip before returning data. Combine with `limit` for offset-based pagination.
            example: 0
          required: false
          description: >-
            Number of results to skip before returning data. Combine with `limit` for offset-based pagination.
          name: offset
          in: query
        - $ref: '#/components/parameters/ApiVersion'
      responses:
        '200':
          description: Government & NGO map points
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GovNgoGeoResponse'
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '401':
          description: >-
            Authentication required. The `Authorization` header was missing, the bearer token was malformed, or the token failed signature / expiry validation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: UNAUTHORIZED
                  message: Authentication required — provide a valid bearer token.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '403':
          description: >-
            Authentication succeeded but the caller's token does not include the permission required for this operation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FORBIDDEN
                  message: You do not have permission to perform this action.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '422':
          description: Validation error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FILTER_PARSE_ERROR
                  message: >-
                    The request could not be processed — check the filter syntax and any identifiers.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '429':
          description: Rate limit exceeded.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
            Retry-After:
              schema:
                type: string
                description: Seconds to wait before retrying.
                example: '1'
              required: true
              description: Seconds to wait before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: RATE_LIMITED
                  message: Rate limit exceeded — retry after the delay in the `Retry-After` header.
  '/data/gov-ngo/{id}':
    get:
      operationId: getGovNgo
      security:
        - oauth2:
            - 'read:entities'
        - bearerAuth:
            - 'read:entities'
      tags:
        - Government & NGO
      summary: Get single government/NGO entity
      description: >-
        Returns the full government/NGO record by UUID (numeric IDs are not accepted), alongside the shared entity base fields.
      parameters:
        - schema:
            type: string
            minLength: 1
            format: uuid
            example: 345d1ab6-33df-4759-9e17-0d0c0ec9ab1c
            description: Stable UUID of the entity. Numeric ids are not accepted.
          required: true
          description: Stable UUID of the entity. Numeric ids are not accepted.
          name: id
          in: path
        - schema:
            type: string
            description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
            example: EUR
          required: false
          description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
          name: currency
          in: query
        - $ref: '#/components/parameters/ApiVersion'
      responses:
        '200':
          description: Single government/NGO entity
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GovNgoDetailResponse'
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '401':
          description: >-
            Authentication required. The `Authorization` header was missing, the bearer token was malformed, or the token failed signature / expiry validation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: UNAUTHORIZED
                  message: Authentication required — provide a valid bearer token.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '403':
          description: >-
            Authentication succeeded but the caller's token does not include the permission required for this operation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FORBIDDEN
                  message: You do not have permission to perform this action.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '404':
          description: Government/NGO entity not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: NOT_FOUND
                  message: The requested resource was not found.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '429':
          description: Rate limit exceeded.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
            Retry-After:
              schema:
                type: string
                description: Seconds to wait before retrying.
                example: '1'
              required: true
              description: Seconds to wait before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: RATE_LIMITED
                  message: Rate limit exceeded — retry after the delay in the `Retry-After` header.
  '/data/gov-ngo/{id}/team':
    get:
      operationId: govNgoTeam
      security:
        - oauth2:
            - 'read:entities'
            - 'read:people'
        - bearerAuth:
            - 'read:entities'
            - 'read:people'
      tags:
        - Government & NGO
      summary: List government & NGO team members
      description: >-
        People associated with the government body or NGO through the people_entities relationship. Supports the same person filter DSL as `/data/people`, plus `role` and `is_past` relationship filters.
      parameters:
        - schema:
            type: string
            minLength: 1
            format: uuid
            example: 345d1ab6-33df-4759-9e17-0d0c0ec9ab1c
            description: Stable UUID of the entity. Numeric ids are not accepted.
          required: true
          description: Stable UUID of the entity. Numeric ids are not accepted.
          name: id
          in: path
        - schema:
            type: string
            description: |
              Filter expression for team members — same syntax and keys as /data/people.

              Examples:
              - Single: hq_location[eq]:233
              - AND: and(hq_location[eq]:233,gender[eq]:female)

              Operators: eq, neq, gt, gte, lt, lte, in_any, nin_any
              Default ref: 'entity'
            example: 'gender[eq]:female'
          required: false
          description: |
            Filter expression for team members — same syntax and keys as /data/people.

            Examples:
            - Single: hq_location[eq]:233
            - AND: and(hq_location[eq]:233,gender[eq]:female)

            Operators: eq, neq, gt, gte, lt, lte, in_any, nin_any
            Default ref: 'entity'
          name: filter
          in: query
        - schema:
            type: integer
            format: int32
            minimum: 1
            maximum: 500
            default: 25
            description: 'Number of results to return (1-500, default 25)'
            example: 25
          required: false
          description: 'Number of results to return (1-500, default 25)'
          name: limit
          in: query
        - schema:
            type: integer
            format: int32
            minimum: 0
            default: 0
            description: >-
              Number of results to skip before returning data. Combine with `limit` for offset-based pagination.
            example: 0
          required: false
          description: >-
            Number of results to skip before returning data. Combine with `limit` for offset-based pagination.
          name: offset
          in: query
        - schema:
            type: string
            pattern: '^-?[\w,]+$'
            description: >-
              Sort by one or more keys. Prefix with `-` for descending order; comma-separated for multi-key sorts.
            example: name
          required: false
          description: >-
            Sort by one or more keys. Prefix with `-` for descending order; comma-separated for multi-key sorts.
          name: sort
          in: query
        - schema:
            type: boolean
            description: >-
              Pass `true` to include `page.total` (the matching record count) in the response. Default omits the total to avoid a count query.
            example: true
          required: false
          description: >-
            Pass `true` to include `page.total` (the matching record count) in the response. Default omits the total to avoid a count query.
          name: include_total
          in: query
        - schema:
            type: string
            description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
            example: EUR
          required: false
          description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
          name: currency
          in: query
        - schema:
            type: string
            enum:
              - founder
              - executive
              - partner
            description: >-
              Restrict to a single relationship role at this entity: `founder`, `executive`, or `partner`. Omit to include everyone.
            example: founder
          required: false
          description: >-
            Restrict to a single relationship role at this entity: `founder`, `executive`, or `partner`. Omit to include everyone.
          name: role
          in: query
        - schema:
            type: boolean
            description: >-
              Filter by tenure at this entity. `false` = current members, `true` = former members. Omit to include both.
            example: false
          required: false
          description: >-
            Filter by tenure at this entity. `false` = current members, `true` = former members. Omit to include both.
          name: is_past
          in: query
        - $ref: '#/components/parameters/ApiVersion'
      responses:
        '200':
          description: Government & NGO team members
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EntityTeamResponse'
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '400':
          description: Invalid entity ID
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: VALIDATION_ERROR
                  message: The request was malformed or failed validation.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '401':
          description: >-
            Authentication required. The `Authorization` header was missing, the bearer token was malformed, or the token failed signature / expiry validation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: UNAUTHORIZED
                  message: Authentication required — provide a valid bearer token.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '403':
          description: >-
            Authentication succeeded but the caller's token does not include the permission required for this operation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FORBIDDEN
                  message: You do not have permission to perform this action.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '422':
          description: Validation error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FILTER_PARSE_ERROR
                  message: >-
                    The request could not be processed — check the filter syntax and any identifiers.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '429':
          description: Rate limit exceeded.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
            Retry-After:
              schema:
                type: string
                description: Seconds to wait before retrying.
                example: '1'
              required: true
              description: Seconds to wait before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: RATE_LIMITED
                  message: Rate limit exceeded — retry after the delay in the `Retry-After` header.
  /data/transactions:
    get:
      operationId: listTransactions
      security:
        - oauth2:
            - 'read:transactions'
        - bearerAuth:
            - 'read:transactions'
      tags:
        - Transactions
      summary: List transactions
      description: >-
        Lists company funding-related transactions (rounds, equity events, debt, grants). Supports the structured filter expression syntax shared with `/data/entities` and the same `limit` / `offset` / `sort` / `include_total` pagination model.
      parameters:
        - schema:
            type: string
            description: |
              Filter expression for transactions.

              Examples:
              - Single: date[gte]:2020
              - AND: and(date[gte]:2020,amount[gte]:1000000)
              - OR: or(round_type[eq]:seed,round_type[eq]:series_a)

              Operators: eq, neq, gt, gte, lt, lte, in_any, nin_any
              in_all / nin_all are only available on repeated related-record filters.
              Default ref: 'funding'
            example: 'and(date[gte]:2020,amount[gte]:1000000)'
          required: false
          description: |
            Filter expression for transactions.

            Examples:
            - Single: date[gte]:2020
            - AND: and(date[gte]:2020,amount[gte]:1000000)
            - OR: or(round_type[eq]:seed,round_type[eq]:series_a)

            Operators: eq, neq, gt, gte, lt, lte, in_any, nin_any
            in_all / nin_all are only available on repeated related-record filters.
            Default ref: 'funding'
          name: filter
          in: query
        - schema:
            type: integer
            format: int32
            minimum: 1
            maximum: 2000
            default: 25
            description: 'Number of results to return (1-2000, default 25)'
            example: 25
          required: false
          description: 'Number of results to return (1-2000, default 25)'
          name: limit
          in: query
        - schema:
            type: integer
            format: int32
            minimum: 0
            default: 0
            description: >-
              Number of results to skip before returning data. Combine with `limit` for offset-based pagination.
            example: 0
          required: false
          description: >-
            Number of results to skip before returning data. Combine with `limit` for offset-based pagination.
          name: offset
          in: query
        - schema:
            type: string
            description: >-
              Opaque cursor token from a previous response's `page.next_cursor` or `page.prev_cursor`. Round-trip it as-is — do not decode or modify.
            example: eyJ2IjoxLCJkIjoibmV4dCJ9
          required: false
          description: >-
            Opaque cursor token from a previous response's `page.next_cursor` or `page.prev_cursor`. Round-trip it as-is — do not decode or modify.
          name: cursor
          in: query
        - schema:
            type: string
            pattern: '^-?[\w,]+$'
            description: >-
              Sort by one or more keys. Prefix with `-` for descending order; comma-separated for multi-key sorts.
            example: '-date'
          required: false
          description: >-
            Sort by one or more keys. Prefix with `-` for descending order; comma-separated for multi-key sorts.
          name: sort
          in: query
        - schema:
            type: boolean
            description: >-
              Pass `true` to include `page.total` (the matching record count) in the response. Default omits the total to avoid a count query.
            example: true
          required: false
          description: >-
            Pass `true` to include `page.total` (the matching record count) in the response. Default omits the total to avoid a count query.
          name: include_total
          in: query
        - schema:
            type: string
            description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
            example: EUR
          required: false
          description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
          name: currency
          in: query
        - $ref: '#/components/parameters/ApiVersion'
      responses:
        '200':
          description: List of transactions
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TransactionListResponse'
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '401':
          description: >-
            Authentication required. The `Authorization` header was missing, the bearer token was malformed, or the token failed signature / expiry validation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: UNAUTHORIZED
                  message: Authentication required — provide a valid bearer token.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '403':
          description: >-
            Authentication succeeded but the caller's token does not include the permission required for this operation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FORBIDDEN
                  message: You do not have permission to perform this action.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '422':
          description: Validation error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FILTER_PARSE_ERROR
                  message: >-
                    The request could not be processed — check the filter syntax and any identifiers.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '429':
          description: Rate limit exceeded.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
            Retry-After:
              schema:
                type: string
                description: Seconds to wait before retrying.
                example: '1'
              required: true
              description: Seconds to wait before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: RATE_LIMITED
                  message: Rate limit exceeded — retry after the delay in the `Retry-After` header.
  /data/valuations:
    get:
      operationId: listValuations
      security:
        - oauth2:
            - 'read:valuations'
        - bearerAuth:
            - 'read:valuations'
      tags:
        - Valuations
      summary: List valuations
      description: >-
        Returns the cross-entity valuation history. Each row is one company's recorded valuation at a specific year/month, with the valuation source where available. Use `/data/companies/{id}/valuations` for a single-entity view.
      parameters:
        - schema:
            type: string
            description: |
              Filter expression for valuations.

              Examples:
              - Single: date[gte]:2020
              - AND: and(date[gte]:2020,value[gte]:1000000000)

              Operators: eq, neq, gt, gte, lt, lte, in_any, nin_any
              in_all / nin_all are only available on repeated related-record filters.
              Default ref: 'valuation'
            example: 'and(date[gte]:2020,value[gte]:1000000000)'
          required: false
          description: |
            Filter expression for valuations.

            Examples:
            - Single: date[gte]:2020
            - AND: and(date[gte]:2020,value[gte]:1000000000)

            Operators: eq, neq, gt, gte, lt, lte, in_any, nin_any
            in_all / nin_all are only available on repeated related-record filters.
            Default ref: 'valuation'
          name: filter
          in: query
        - schema:
            type: integer
            format: int32
            minimum: 1
            maximum: 2000
            default: 25
            description: 'Number of results to return (1-2000, default 25)'
            example: 25
          required: false
          description: 'Number of results to return (1-2000, default 25)'
          name: limit
          in: query
        - schema:
            type: integer
            format: int32
            minimum: 0
            default: 0
            description: >-
              Number of results to skip before returning data. Combine with `limit` for offset-based pagination.
            example: 0
          required: false
          description: >-
            Number of results to skip before returning data. Combine with `limit` for offset-based pagination.
          name: offset
          in: query
        - schema:
            type: string
            description: >-
              Opaque cursor token from a previous response's `page.next_cursor` or `page.prev_cursor`. Round-trip it as-is — do not decode or modify.
            example: eyJ2IjoxLCJkIjoibmV4dCJ9
          required: false
          description: >-
            Opaque cursor token from a previous response's `page.next_cursor` or `page.prev_cursor`. Round-trip it as-is — do not decode or modify.
          name: cursor
          in: query
        - schema:
            type: string
            pattern: '^-?[\w,]+$'
            description: >-
              Sort by one or more keys. Prefix with `-` for descending order; comma-separated for multi-key sorts.
            example: '-date'
          required: false
          description: >-
            Sort by one or more keys. Prefix with `-` for descending order; comma-separated for multi-key sorts.
          name: sort
          in: query
        - schema:
            type: boolean
            description: >-
              Pass `true` to include `page.total` (the matching record count) in the response. Default omits the total to avoid a count query.
            example: true
          required: false
          description: >-
            Pass `true` to include `page.total` (the matching record count) in the response. Default omits the total to avoid a count query.
          name: include_total
          in: query
        - schema:
            type: string
            description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
            example: EUR
          required: false
          description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
          name: currency
          in: query
        - $ref: '#/components/parameters/ApiVersion'
      responses:
        '200':
          description: List of valuations
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValuationListResponse'
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '401':
          description: >-
            Authentication required. The `Authorization` header was missing, the bearer token was malformed, or the token failed signature / expiry validation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: UNAUTHORIZED
                  message: Authentication required — provide a valid bearer token.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '403':
          description: >-
            Authentication succeeded but the caller's token does not include the permission required for this operation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FORBIDDEN
                  message: You do not have permission to perform this action.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '422':
          description: Validation error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FILTER_PARSE_ERROR
                  message: >-
                    The request could not be processed — check the filter syntax and any identifiers.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '429':
          description: Rate limit exceeded.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
            Retry-After:
              schema:
                type: string
                description: Seconds to wait before retrying.
                example: '1'
              required: true
              description: Seconds to wait before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: RATE_LIMITED
                  message: Rate limit exceeded — retry after the delay in the `Retry-After` header.
  /data/investors:
    get:
      operationId: listInvestors
      security:
        - oauth2:
            - 'read:investors'
        - bearerAuth:
            - 'read:investors'
      tags:
        - Investors
      summary: List investors
      description: >-
        Returns a paginated list of investors (VCs, corporates, angels, etc.) with optional filters and sorting. All entities with is_investor=true are included. Use portfolio_count_tag and/or portfolio_count_location to compute a portfolio match count (number of investments matching specified tags/locations). When provided, the sort key portfolio_match_count becomes available and match_count appears in the portfolio response object.
      parameters:
        - schema:
            type: string
            description: |
              Filter expression for investors using nested syntax.

              Examples:
              - Single: total_invested[gte]:1000000
              - AND: and(total_invested[gte]:1000000,hq_location[eq]:233)
              - OR: or(investor_type[eq]:venture_capital,investor_type[eq]:private_equity)

              Operators: eq, neq, gt, gte, lt, lte, in_any, nin_any
              in_all / nin_all are only available on repeated related-record filters.
              Default ref: 'entity' (can be omitted for entity filters)
            example: 'and(total_invested[gte]:1000000,hq_location[eq]:233)'
          required: false
          description: |
            Filter expression for investors using nested syntax.

            Examples:
            - Single: total_invested[gte]:1000000
            - AND: and(total_invested[gte]:1000000,hq_location[eq]:233)
            - OR: or(investor_type[eq]:venture_capital,investor_type[eq]:private_equity)

            Operators: eq, neq, gt, gte, lt, lte, in_any, nin_any
            in_all / nin_all are only available on repeated related-record filters.
            Default ref: 'entity' (can be omitted for entity filters)
          name: filter
          in: query
        - schema:
            type: integer
            format: int32
            minimum: 1
            maximum: 500
            default: 25
            description: 'Number of results to return (1-500, default 25)'
            example: 25
          required: false
          description: 'Number of results to return (1-500, default 25)'
          name: limit
          in: query
        - schema:
            type: integer
            format: int32
            minimum: 0
            default: 0
            description: >-
              Number of results to skip before returning data. Combine with `limit` for offset-based pagination.
            example: 0
          required: false
          description: >-
            Number of results to skip before returning data. Combine with `limit` for offset-based pagination.
          name: offset
          in: query
        - schema:
            type: string
            description: >-
              Opaque cursor token from a previous response's `page.next_cursor` or `page.prev_cursor`. Round-trip it as-is — do not decode or modify.
            example: eyJ2IjoxLCJkIjoibmV4dCJ9
          required: false
          description: >-
            Opaque cursor token from a previous response's `page.next_cursor` or `page.prev_cursor`. Round-trip it as-is — do not decode or modify.
          name: cursor
          in: query
        - schema:
            type: string
            pattern: '^-?[\w,]+$'
            description: >-
              Sort by one or more keys. Prefix with `-` for descending order; comma-separated for multi-key sorts.
            example: '-total_investments_count'
          required: false
          description: >-
            Sort by one or more keys. Prefix with `-` for descending order; comma-separated for multi-key sorts.
          name: sort
          in: query
        - schema:
            type: boolean
            description: >-
              Pass `true` to include `page.total` (the matching record count) in the response. Default omits the total to avoid a count query.
            example: true
          required: false
          description: >-
            Pass `true` to include `page.total` (the matching record count) in the response. Default omits the total to avoid a count query.
          name: include_total
          in: query
        - schema:
            type: string
            description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
            example: EUR
          required: false
          description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
          name: currency
          in: query
        - schema:
            type: string
            pattern: ^\d+(\|\d+)*$
            description: >-
              Pipe-separated tag IDs to count matching portfolio investments. Enables the portfolio_match_count sort key and match_count response field.
            example: '22680'
          required: false
          description: >-
            Pipe-separated tag IDs to count matching portfolio investments. Enables the portfolio_match_count sort key and match_count response field.
          name: portfolio_count_tag
          in: query
        - schema:
            type: string
            pattern: ^\d+(\|\d+)*$
            description: >-
              Pipe-separated location IDs to count matching portfolio investments. Enables the portfolio_match_count sort key and match_count response field.
            example: '165'
          required: false
          description: >-
            Pipe-separated location IDs to count matching portfolio investments. Enables the portfolio_match_count sort key and match_count response field.
          name: portfolio_count_location
          in: query
        - $ref: '#/components/parameters/ApiVersion'
      responses:
        '200':
          description: List of investors
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InvestorListResponse'
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '401':
          description: >-
            Authentication required. The `Authorization` header was missing, the bearer token was malformed, or the token failed signature / expiry validation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: UNAUTHORIZED
                  message: Authentication required — provide a valid bearer token.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '403':
          description: >-
            Authentication succeeded but the caller's token does not include the permission required for this operation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FORBIDDEN
                  message: You do not have permission to perform this action.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '422':
          description: Validation error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FILTER_PARSE_ERROR
                  message: >-
                    The request could not be processed — check the filter syntax and any identifiers.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '429':
          description: Rate limit exceeded.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
            Retry-After:
              schema:
                type: string
                description: Seconds to wait before retrying.
                example: '1'
              required: true
              description: Seconds to wait before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: RATE_LIMITED
                  message: Rate limit exceeded — retry after the delay in the `Retry-After` header.
  /data/investors/geo:
    get:
      operationId: listInvestorGeoPoints
      security:
        - oauth2:
            - 'read:investors'
        - bearerAuth:
            - 'read:investors'
      tags:
        - Investors
      summary: List investor map points
      description: >-
        Slim investor payload for map rendering (the startup map's dot layer): one point per investor with HQ coordinates and an optional `size_by` metric value. Accepts the same filter syntax as `/investors`. When `size_by` is set, points sort by that dimension descending, so capped responses keep the highest-value points. Investors without usable HQ coordinates are omitted. Monetary values are USD. For per-area counts (the map's choropleth layer), use the aggregate endpoint: GET /analytics/aggregate/investors?metric=count&group_by=map_area.
      parameters:
        - schema:
            type: string
            description: >-
              Filter expression for investors — identical syntax and semantics to the `/investors` list filter.
            example: 'and(total_invested[gte]:1000000,hq_location[eq]:233)'
          required: false
          description: >-
            Filter expression for investors — identical syntax and semantics to the `/investors` list filter.
          name: filter
          in: query
        - schema:
            type: string
            enum:
              - total_funding
              - employee_count
              - latest_valuation
              - total_invested
              - total_investments_count
              - alumni_count
              - alumni_founder_count
            description: >-
              Numeric dimension returned as each point's `value` (for proportional dot sizing). Monetary dimensions are USD. Also sorts the result descending, so a capped response keeps the highest-value points. Omitted → `value` is null and the default sort applies.
            example: total_funding
          required: false
          description: >-
            Numeric dimension returned as each point's `value` (for proportional dot sizing). Monetary dimensions are USD. Also sorts the result descending, so a capped response keeps the highest-value points. Omitted → `value` is null and the default sort applies.
          name: size_by
          in: query
        - schema:
            type: integer
            format: int32
            minimum: 1
            maximum: 5000
            default: 5000
            description: 'Number of results to return (1-5000, default 5000)'
            example: 5000
          required: false
          description: 'Number of results to return (1-5000, default 5000)'
          name: limit
          in: query
        - schema:
            type: integer
            format: int32
            minimum: 0
            default: 0
            description: >-
              Number of results to skip before returning data. Combine with `limit` for offset-based pagination.
            example: 0
          required: false
          description: >-
            Number of results to skip before returning data. Combine with `limit` for offset-based pagination.
          name: offset
          in: query
        - $ref: '#/components/parameters/ApiVersion'
      responses:
        '200':
          description: Investor map points
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InvestorGeoResponse'
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '401':
          description: >-
            Authentication required. The `Authorization` header was missing, the bearer token was malformed, or the token failed signature / expiry validation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: UNAUTHORIZED
                  message: Authentication required — provide a valid bearer token.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '403':
          description: >-
            Authentication succeeded but the caller's token does not include the permission required for this operation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FORBIDDEN
                  message: You do not have permission to perform this action.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '422':
          description: Validation error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FILTER_PARSE_ERROR
                  message: >-
                    The request could not be processed — check the filter syntax and any identifiers.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '429':
          description: Rate limit exceeded.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
            Retry-After:
              schema:
                type: string
                description: Seconds to wait before retrying.
                example: '1'
              required: true
              description: Seconds to wait before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: RATE_LIMITED
                  message: Rate limit exceeded — retry after the delay in the `Retry-After` header.
  '/data/investors/{id}':
    get:
      operationId: getInvestor
      security:
        - oauth2:
            - 'read:investors'
        - bearerAuth:
            - 'read:investors'
      tags:
        - Investors
      summary: Get single investor
      description: >-
        Returns the full investor profile by UUID (numeric IDs are not accepted). Includes investor type, stages, deal-size ranges, portfolio summary (top companies, total rounds, total invested), and the underlying entity record. Monetary fields convert to the requested `?currency=`.
      parameters:
        - schema:
            type: string
            minLength: 1
            format: uuid
            example: 345d1ab6-33df-4759-9e17-0d0c0ec9ab1c
            description: Stable UUID of the entity. Numeric ids are not accepted.
          required: true
          description: Stable UUID of the entity. Numeric ids are not accepted.
          name: id
          in: path
        - schema:
            type: string
            description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
            example: EUR
          required: false
          description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
          name: currency
          in: query
        - $ref: '#/components/parameters/ApiVersion'
      responses:
        '200':
          description: Single investor
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InvestorDetailResponse'
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '401':
          description: >-
            Authentication required. The `Authorization` header was missing, the bearer token was malformed, or the token failed signature / expiry validation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: UNAUTHORIZED
                  message: Authentication required — provide a valid bearer token.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '403':
          description: >-
            Authentication succeeded but the caller's token does not include the permission required for this operation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FORBIDDEN
                  message: You do not have permission to perform this action.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '404':
          description: Investor not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: NOT_FOUND
                  message: The requested resource was not found.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '429':
          description: Rate limit exceeded.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
            Retry-After:
              schema:
                type: string
                description: Seconds to wait before retrying.
                example: '1'
              required: true
              description: Seconds to wait before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: RATE_LIMITED
                  message: Rate limit exceeded — retry after the delay in the `Retry-After` header.
  '/data/investors/{id}/portfolio':
    get:
      operationId: investorPortfolio
      security:
        - oauth2:
            - 'read:investors'
        - bearerAuth:
            - 'read:investors'
      tags:
        - Investors
      summary: List portfolio companies
      description: >-
        Portfolio companies this investor has backed, de-duplicated to one row per company with aggregate involvement. Includes investments not attributed to any disclosed round (`rounds_count: 0`). Sort by most recent round (default) or latest company valuation, and filter the companies with the same entity `?filter[...]` DSL as `/data/companies`.
      parameters:
        - schema:
            type: string
            minLength: 1
            format: uuid
            example: 345d1ab6-33df-4759-9e17-0d0c0ec9ab1c
            description: Stable UUID of the entity. Numeric ids are not accepted.
          required: true
          description: Stable UUID of the entity. Numeric ids are not accepted.
          name: id
          in: path
        - schema:
            type: string
            description: >
              Filter expression for the portfolio companies — same syntax and keys as /data/companies.


              Operators: eq, neq, gt, gte, lt, lte, in_any, nin_any

              Default ref: 'entity'

            example: 'launch_date[gte]:2015'
          required: false
          description: |
            Filter expression for the portfolio companies — same syntax and keys as /data/companies.

            Operators: eq, neq, gt, gte, lt, lte, in_any, nin_any
            Default ref: 'entity'
          name: filter
          in: query
        - schema:
            type: integer
            format: int32
            minimum: 1
            maximum: 500
            default: 25
            description: 'Number of results to return (1-500, default 25)'
            example: 25
          required: false
          description: 'Number of results to return (1-500, default 25)'
          name: limit
          in: query
        - schema:
            type: integer
            format: int32
            minimum: 0
            default: 0
            description: >-
              Number of results to skip before returning data. Combine with `limit` for offset-based pagination.
            example: 0
          required: false
          description: >-
            Number of results to skip before returning data. Combine with `limit` for offset-based pagination.
          name: offset
          in: query
        - schema:
            type: boolean
            description: >-
              Pass `true` to include `page.total` (the matching record count) in the response. Default omits the total to avoid a count query.
            example: true
          required: false
          description: >-
            Pass `true` to include `page.total` (the matching record count) in the response. Default omits the total to avoid a count query.
          name: include_total
          in: query
        - schema:
            type: string
            description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
            example: EUR
          required: false
          description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
          name: currency
          in: query
        - schema:
            type: string
            enum:
              - '-last_round_date'
              - '-latest_valuation'
            description: >-
              Sort order for portfolio companies. `-last_round_date` (default) returns the most recently backed companies first; `-latest_valuation` returns the highest-valuation companies first (unknown valuations last).
            example: '-latest_valuation'
          required: false
          description: >-
            Sort order for portfolio companies. `-last_round_date` (default) returns the most recently backed companies first; `-latest_valuation` returns the highest-valuation companies first (unknown valuations last).
          name: sort
          in: query
        - $ref: '#/components/parameters/ApiVersion'
      responses:
        '200':
          description: Investor portfolio
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EntityInvestmentsResponse'
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '400':
          description: Invalid entity ID
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: VALIDATION_ERROR
                  message: The request was malformed or failed validation.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '401':
          description: >-
            Authentication required. The `Authorization` header was missing, the bearer token was malformed, or the token failed signature / expiry validation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: UNAUTHORIZED
                  message: Authentication required — provide a valid bearer token.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '403':
          description: >-
            Authentication succeeded but the caller's token does not include the permission required for this operation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FORBIDDEN
                  message: You do not have permission to perform this action.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '429':
          description: Rate limit exceeded.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
            Retry-After:
              schema:
                type: string
                description: Seconds to wait before retrying.
                example: '1'
              required: true
              description: Seconds to wait before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: RATE_LIMITED
                  message: Rate limit exceeded — retry after the delay in the `Retry-After` header.
  '/data/investors/{id}/funds':
    get:
      operationId: investorFunds
      security:
        - oauth2:
            - 'read:investors'
        - bearerAuth:
            - 'read:investors'
      tags:
        - Investors
      summary: List funds
      description: >-
        The individual fund vehicles this investor firm has raised (e.g. "Fund III", $200M, 2024), newest first. `amount` is the fund size in the requested `?currency=` (default USD); `amount_source` carries the original as-stored amount and native currency.
      parameters:
        - schema:
            type: string
            minLength: 1
            format: uuid
            example: 345d1ab6-33df-4759-9e17-0d0c0ec9ab1c
            description: Stable UUID of the entity. Numeric ids are not accepted.
          required: true
          description: Stable UUID of the entity. Numeric ids are not accepted.
          name: id
          in: path
        - schema:
            type: string
            description: |
              Filter expression for the raised funds — same syntax and keys as /data/funds.

              Examples:
              - Single: fund_type[eq]:vc
              - AND: and(is_closed[eq]:true,amount[gte]:100000000)

              Operators: eq, neq, gt, gte, lt, lte, in_any, nin_any
              Default ref: 'funds'
            example: 'is_closed[eq]:true'
          required: false
          description: |
            Filter expression for the raised funds — same syntax and keys as /data/funds.

            Examples:
            - Single: fund_type[eq]:vc
            - AND: and(is_closed[eq]:true,amount[gte]:100000000)

            Operators: eq, neq, gt, gte, lt, lte, in_any, nin_any
            Default ref: 'funds'
          name: filter
          in: query
        - schema:
            type: integer
            format: int32
            minimum: 1
            maximum: 500
            default: 25
            description: 'Number of results to return (1-500, default 25)'
            example: 25
          required: false
          description: 'Number of results to return (1-500, default 25)'
          name: limit
          in: query
        - schema:
            type: integer
            format: int32
            minimum: 0
            default: 0
            description: >-
              Number of results to skip before returning data. Combine with `limit` for offset-based pagination.
            example: 0
          required: false
          description: >-
            Number of results to skip before returning data. Combine with `limit` for offset-based pagination.
          name: offset
          in: query
        - schema:
            type: string
            pattern: '^-?[\w,]+$'
            description: >-
              Sort by one or more keys. Prefix with `-` for descending order; comma-separated for multi-key sorts.
            example: '-fund_date'
          required: false
          description: >-
            Sort by one or more keys. Prefix with `-` for descending order; comma-separated for multi-key sorts.
          name: sort
          in: query
        - schema:
            type: boolean
            description: >-
              Pass `true` to include `page.total` (the matching record count) in the response. Default omits the total to avoid a count query.
            example: true
          required: false
          description: >-
            Pass `true` to include `page.total` (the matching record count) in the response. Default omits the total to avoid a count query.
          name: include_total
          in: query
        - schema:
            type: string
            description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
            example: EUR
          required: false
          description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
          name: currency
          in: query
        - $ref: '#/components/parameters/ApiVersion'
      responses:
        '200':
          description: Funds raised by this investor
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EntityFundsResponse'
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '400':
          description: Invalid entity ID
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: VALIDATION_ERROR
                  message: The request was malformed or failed validation.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '401':
          description: >-
            Authentication required. The `Authorization` header was missing, the bearer token was malformed, or the token failed signature / expiry validation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: UNAUTHORIZED
                  message: Authentication required — provide a valid bearer token.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '403':
          description: >-
            Authentication succeeded but the caller's token does not include the permission required for this operation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FORBIDDEN
                  message: You do not have permission to perform this action.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '429':
          description: Rate limit exceeded.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
            Retry-After:
              schema:
                type: string
                description: Seconds to wait before retrying.
                example: '1'
              required: true
              description: Seconds to wait before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: RATE_LIMITED
                  message: Rate limit exceeded — retry after the delay in the `Retry-After` header.
  '/data/investors/{id}/lp-funds':
    get:
      operationId: investorLpFunds
      security:
        - oauth2:
            - 'read:investors'
        - bearerAuth:
            - 'read:investors'
      tags:
        - Investors
      summary: List LP fund positions
      description: >-
        Investor firms whose known limited partners include this entity. Each row is an investor-firm entity (not a fund vehicle) with its investor type names.
      parameters:
        - schema:
            type: string
            minLength: 1
            format: uuid
            example: 345d1ab6-33df-4759-9e17-0d0c0ec9ab1c
            description: Stable UUID of the entity. Numeric ids are not accepted.
          required: true
          description: Stable UUID of the entity. Numeric ids are not accepted.
          name: id
          in: path
        - schema:
            type: string
            description: |
              Filter expression for the investor firms — same syntax and keys as /data/investors.

              Operators: eq, neq, gt, gte, lt, lte, in_any, nin_any
              Default ref: 'entity'
            example: 'investor_type[eq]:venture_capital'
          required: false
          description: |
            Filter expression for the investor firms — same syntax and keys as /data/investors.

            Operators: eq, neq, gt, gte, lt, lte, in_any, nin_any
            Default ref: 'entity'
          name: filter
          in: query
        - schema:
            type: integer
            format: int32
            minimum: 1
            maximum: 500
            default: 25
            description: 'Number of results to return (1-500, default 25)'
            example: 25
          required: false
          description: 'Number of results to return (1-500, default 25)'
          name: limit
          in: query
        - schema:
            type: integer
            format: int32
            minimum: 0
            default: 0
            description: >-
              Number of results to skip before returning data. Combine with `limit` for offset-based pagination.
            example: 0
          required: false
          description: >-
            Number of results to skip before returning data. Combine with `limit` for offset-based pagination.
          name: offset
          in: query
        - schema:
            type: boolean
            description: >-
              Pass `true` to include `page.total` (the matching record count) in the response. Default omits the total to avoid a count query.
            example: true
          required: false
          description: >-
            Pass `true` to include `page.total` (the matching record count) in the response. Default omits the total to avoid a count query.
          name: include_total
          in: query
        - schema:
            type: string
            description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
            example: EUR
          required: false
          description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
          name: currency
          in: query
        - $ref: '#/components/parameters/ApiVersion'
      responses:
        '200':
          description: Investor firms with this entity as a known LP
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EntityLpFundsResponse'
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '400':
          description: Invalid entity ID
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: VALIDATION_ERROR
                  message: The request was malformed or failed validation.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '401':
          description: >-
            Authentication required. The `Authorization` header was missing, the bearer token was malformed, or the token failed signature / expiry validation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: UNAUTHORIZED
                  message: Authentication required — provide a valid bearer token.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '403':
          description: >-
            Authentication succeeded but the caller's token does not include the permission required for this operation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FORBIDDEN
                  message: You do not have permission to perform this action.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '429':
          description: Rate limit exceeded.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
            Retry-After:
              schema:
                type: string
                description: Seconds to wait before retrying.
                example: '1'
              required: true
              description: Seconds to wait before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: RATE_LIMITED
                  message: Rate limit exceeded — retry after the delay in the `Retry-After` header.
  '/data/investors/{id}/team':
    get:
      operationId: investorTeam
      security:
        - oauth2:
            - 'read:investors'
            - 'read:people'
        - bearerAuth:
            - 'read:investors'
            - 'read:people'
      tags:
        - Investors
      summary: List investor team members
      description: >-
        People associated with the investor firm through the people_entities relationship (partners, executives, and other team members). Supports the same person filter DSL as `/data/people`, plus `role` and `is_past` relationship filters. Exposed on the investor lens because investor firms are not always `organization_subtype = 'company'`, so this is their guaranteed team path.
      parameters:
        - schema:
            type: string
            minLength: 1
            format: uuid
            example: 345d1ab6-33df-4759-9e17-0d0c0ec9ab1c
            description: Stable UUID of the entity. Numeric ids are not accepted.
          required: true
          description: Stable UUID of the entity. Numeric ids are not accepted.
          name: id
          in: path
        - schema:
            type: string
            description: |
              Filter expression for team members — same syntax and keys as /data/people.

              Examples:
              - Single: hq_location[eq]:233
              - AND: and(hq_location[eq]:233,gender[eq]:female)

              Operators: eq, neq, gt, gte, lt, lte, in_any, nin_any
              Default ref: 'entity'
            example: 'gender[eq]:female'
          required: false
          description: |
            Filter expression for team members — same syntax and keys as /data/people.

            Examples:
            - Single: hq_location[eq]:233
            - AND: and(hq_location[eq]:233,gender[eq]:female)

            Operators: eq, neq, gt, gte, lt, lte, in_any, nin_any
            Default ref: 'entity'
          name: filter
          in: query
        - schema:
            type: integer
            format: int32
            minimum: 1
            maximum: 500
            default: 25
            description: 'Number of results to return (1-500, default 25)'
            example: 25
          required: false
          description: 'Number of results to return (1-500, default 25)'
          name: limit
          in: query
        - schema:
            type: integer
            format: int32
            minimum: 0
            default: 0
            description: >-
              Number of results to skip before returning data. Combine with `limit` for offset-based pagination.
            example: 0
          required: false
          description: >-
            Number of results to skip before returning data. Combine with `limit` for offset-based pagination.
          name: offset
          in: query
        - schema:
            type: string
            pattern: '^-?[\w,]+$'
            description: >-
              Sort by one or more keys. Prefix with `-` for descending order; comma-separated for multi-key sorts.
            example: name
          required: false
          description: >-
            Sort by one or more keys. Prefix with `-` for descending order; comma-separated for multi-key sorts.
          name: sort
          in: query
        - schema:
            type: boolean
            description: >-
              Pass `true` to include `page.total` (the matching record count) in the response. Default omits the total to avoid a count query.
            example: true
          required: false
          description: >-
            Pass `true` to include `page.total` (the matching record count) in the response. Default omits the total to avoid a count query.
          name: include_total
          in: query
        - schema:
            type: string
            description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
            example: EUR
          required: false
          description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
          name: currency
          in: query
        - schema:
            type: string
            enum:
              - founder
              - executive
              - partner
            description: >-
              Restrict to a single relationship role at this entity: `founder`, `executive`, or `partner`. Omit to include everyone.
            example: founder
          required: false
          description: >-
            Restrict to a single relationship role at this entity: `founder`, `executive`, or `partner`. Omit to include everyone.
          name: role
          in: query
        - schema:
            type: boolean
            description: >-
              Filter by tenure at this entity. `false` = current members, `true` = former members. Omit to include both.
            example: false
          required: false
          description: >-
            Filter by tenure at this entity. `false` = current members, `true` = former members. Omit to include both.
          name: is_past
          in: query
        - $ref: '#/components/parameters/ApiVersion'
      responses:
        '200':
          description: Investor team members
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EntityTeamResponse'
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '400':
          description: Invalid entity ID
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: VALIDATION_ERROR
                  message: The request was malformed or failed validation.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '401':
          description: >-
            Authentication required. The `Authorization` header was missing, the bearer token was malformed, or the token failed signature / expiry validation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: UNAUTHORIZED
                  message: Authentication required — provide a valid bearer token.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '403':
          description: >-
            Authentication succeeded but the caller's token does not include the permission required for this operation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FORBIDDEN
                  message: You do not have permission to perform this action.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '422':
          description: Validation error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FILTER_PARSE_ERROR
                  message: >-
                    The request could not be processed — check the filter syntax and any identifiers.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '429':
          description: Rate limit exceeded.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
            Retry-After:
              schema:
                type: string
                description: Seconds to wait before retrying.
                example: '1'
              required: true
              description: Seconds to wait before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: RATE_LIMITED
                  message: Rate limit exceeded — retry after the delay in the `Retry-After` header.
  '/data/investors/{id}/similar':
    get:
      operationId: investorSimilar
      security:
        - oauth2:
            - 'read:investors'
        - bearerAuth:
            - 'read:investors'
      tags:
        - Investors
      summary: List similar investors
      description: >-
        Investors ranked by similarity to this investor, scored by weighted overlap of their investment-portfolio tags — the industries and sectors of the companies each has funded (the legacy investment_categories / investment_sectors signals). Force-sorted by score; supports the full investor filter DSL to narrow the candidate pool. Offset pagination, capped at offset+limit ≤ 1000.
      parameters:
        - schema:
            type: string
            minLength: 1
            format: uuid
            example: 345d1ab6-33df-4759-9e17-0d0c0ec9ab1c
            description: Stable UUID of the entity. Numeric ids are not accepted.
          required: true
          description: Stable UUID of the entity. Numeric ids are not accepted.
          name: id
          in: path
        - schema:
            type: string
            description: |
              Filter expression for investors using nested syntax.

              Examples:
              - Single: total_invested[gte]:1000000
              - AND: and(total_invested[gte]:1000000,hq_location[eq]:233)
              - OR: or(investor_type[eq]:venture_capital,investor_type[eq]:private_equity)

              Operators: eq, neq, gt, gte, lt, lte, in_any, nin_any
              in_all / nin_all are only available on repeated related-record filters.
              Default ref: 'entity' (can be omitted for entity filters)
            example: 'and(total_invested[gte]:1000000,hq_location[eq]:233)'
          required: false
          description: |
            Filter expression for investors using nested syntax.

            Examples:
            - Single: total_invested[gte]:1000000
            - AND: and(total_invested[gte]:1000000,hq_location[eq]:233)
            - OR: or(investor_type[eq]:venture_capital,investor_type[eq]:private_equity)

            Operators: eq, neq, gt, gte, lt, lte, in_any, nin_any
            in_all / nin_all are only available on repeated related-record filters.
            Default ref: 'entity' (can be omitted for entity filters)
          name: filter
          in: query
        - schema:
            type: integer
            format: int32
            minimum: 1
            maximum: 500
            default: 25
            description: 'Number of results to return (1-500, default 25)'
            example: 25
          required: false
          description: 'Number of results to return (1-500, default 25)'
          name: limit
          in: query
        - schema:
            type: integer
            format: int32
            minimum: 0
            default: 0
            description: >-
              Number of results to skip before returning data. Combine with `limit` for offset-based pagination.
            example: 0
          required: false
          description: >-
            Number of results to skip before returning data. Combine with `limit` for offset-based pagination.
          name: offset
          in: query
        - schema:
            type: string
            pattern: '^-?[\w,]+$'
            description: >-
              Sort by one or more keys. Prefix with `-` for descending order; comma-separated for multi-key sorts.
            example: '-total_investments_count'
          required: false
          description: >-
            Sort by one or more keys. Prefix with `-` for descending order; comma-separated for multi-key sorts.
          name: sort
          in: query
        - schema:
            type: boolean
            description: >-
              Pass `true` to include `page.total` (the matching record count) in the response. Default omits the total to avoid a count query.
            example: true
          required: false
          description: >-
            Pass `true` to include `page.total` (the matching record count) in the response. Default omits the total to avoid a count query.
          name: include_total
          in: query
        - schema:
            type: string
            description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
            example: EUR
          required: false
          description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
          name: currency
          in: query
        - schema:
            type: string
            pattern: ^\d+(\|\d+)*$
            description: >-
              Pipe-separated tag IDs to count matching portfolio investments. Enables the portfolio_match_count sort key and match_count response field.
            example: '22680'
          required: false
          description: >-
            Pipe-separated tag IDs to count matching portfolio investments. Enables the portfolio_match_count sort key and match_count response field.
          name: portfolio_count_tag
          in: query
        - schema:
            type: string
            pattern: ^\d+(\|\d+)*$
            description: >-
              Pipe-separated location IDs to count matching portfolio investments. Enables the portfolio_match_count sort key and match_count response field.
            example: '165'
          required: false
          description: >-
            Pipe-separated location IDs to count matching portfolio investments. Enables the portfolio_match_count sort key and match_count response field.
          name: portfolio_count_location
          in: query
        - $ref: '#/components/parameters/ApiVersion'
      responses:
        '200':
          description: Similar investors
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InvestorListResponse'
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '400':
          description: >-
            Invalid request — e.g. malformed entity id, or offset+limit beyond the similarity window cap (1000)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: VALIDATION_ERROR
                  message: The request was malformed or failed validation.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '401':
          description: >-
            Authentication required. The `Authorization` header was missing, the bearer token was malformed, or the token failed signature / expiry validation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: UNAUTHORIZED
                  message: Authentication required — provide a valid bearer token.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '403':
          description: >-
            Authentication succeeded but the caller's token does not include the permission required for this operation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FORBIDDEN
                  message: You do not have permission to perform this action.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '404':
          description: Anchor entity not found in this collection
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: NOT_FOUND
                  message: The requested resource was not found.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '422':
          description: Validation error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FILTER_PARSE_ERROR
                  message: >-
                    The request could not be processed — check the filter syntax and any identifiers.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '429':
          description: Rate limit exceeded.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
            Retry-After:
              schema:
                type: string
                description: Seconds to wait before retrying.
                example: '1'
              required: true
              description: Seconds to wait before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: RATE_LIMITED
                  message: Rate limit exceeded — retry after the delay in the `Retry-After` header.
  /data/funds:
    get:
      operationId: listFunds
      security:
        - oauth2:
            - 'read:entities'
        - bearerAuth:
            - 'read:entities'
      tags:
        - Funds
      summary: List funds
      description: >-
        Returns a paginated list of funds — the capital vehicles investor firms raise — newest first. Filter via the `filter` expression (`fund_type`, `is_closed`, `amount`, `year`, `investor_id`). Each fund links to its manager (GP). `amount` is the fund size in the requested `?currency=` (default USD); `amount_source` carries the original as-stored amount and its native currency.
      parameters:
        - schema:
            type: string
            description: |
              Filter expression for funds (the capital vehicles investor firms raise).

              Examples:
              - Single: fund_type[eq]:Venture Capital
              - AND: and(fund_type[eq]:Venture Capital,year[gte]:2020)
              - OR: or(fund_type[eq]:Venture Capital,fund_type[eq]:Growth Equity)

              Filters: fund_type, is_closed, amount (native fund size, not currency-converted),
              year (vintage), investor_id (manager/GP entity UUID).
              Operators: eq, neq, gt, gte, lt, lte, in_any, nin_any
              Default ref: 'funds'
            example: 'and(fund_type[eq]:Venture Capital,year[gte]:2020)'
          required: false
          description: |
            Filter expression for funds (the capital vehicles investor firms raise).

            Examples:
            - Single: fund_type[eq]:Venture Capital
            - AND: and(fund_type[eq]:Venture Capital,year[gte]:2020)
            - OR: or(fund_type[eq]:Venture Capital,fund_type[eq]:Growth Equity)

            Filters: fund_type, is_closed, amount (native fund size, not currency-converted),
            year (vintage), investor_id (manager/GP entity UUID).
            Operators: eq, neq, gt, gte, lt, lte, in_any, nin_any
            Default ref: 'funds'
          name: filter
          in: query
        - schema:
            type: integer
            format: int32
            minimum: 1
            maximum: 2000
            default: 25
            description: 'Number of results to return (1-2000, default 25)'
            example: 25
          required: false
          description: 'Number of results to return (1-2000, default 25)'
          name: limit
          in: query
        - schema:
            type: integer
            format: int32
            minimum: 0
            default: 0
            description: >-
              Number of results to skip before returning data. Combine with `limit` for offset-based pagination.
            example: 0
          required: false
          description: >-
            Number of results to skip before returning data. Combine with `limit` for offset-based pagination.
          name: offset
          in: query
        - schema:
            type: string
            description: >-
              Opaque cursor token from a previous response's `page.next_cursor` or `page.prev_cursor`. Round-trip it as-is — do not decode or modify.
            example: eyJ2IjoxLCJkIjoibmV4dCJ9
          required: false
          description: >-
            Opaque cursor token from a previous response's `page.next_cursor` or `page.prev_cursor`. Round-trip it as-is — do not decode or modify.
          name: cursor
          in: query
        - schema:
            type: string
            pattern: '^-?[\w,]+$'
            description: >-
              Sort by one or more keys. Prefix with `-` for descending order; comma-separated for multi-key sorts.
            example: '-fund_date'
          required: false
          description: >-
            Sort by one or more keys. Prefix with `-` for descending order; comma-separated for multi-key sorts.
          name: sort
          in: query
        - schema:
            type: boolean
            description: >-
              Pass `true` to include `page.total` (the matching record count) in the response. Default omits the total to avoid a count query.
            example: true
          required: false
          description: >-
            Pass `true` to include `page.total` (the matching record count) in the response. Default omits the total to avoid a count query.
          name: include_total
          in: query
        - schema:
            type: string
            description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
            example: EUR
          required: false
          description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
          name: currency
          in: query
        - $ref: '#/components/parameters/ApiVersion'
      responses:
        '200':
          description: List of funds
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FundListResponse'
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '401':
          description: >-
            Authentication required. The `Authorization` header was missing, the bearer token was malformed, or the token failed signature / expiry validation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: UNAUTHORIZED
                  message: Authentication required — provide a valid bearer token.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '403':
          description: >-
            Authentication succeeded but the caller's token does not include the permission required for this operation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FORBIDDEN
                  message: You do not have permission to perform this action.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '422':
          description: Validation error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FILTER_PARSE_ERROR
                  message: >-
                    The request could not be processed — check the filter syntax and any identifiers.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '429':
          description: Rate limit exceeded.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
            Retry-After:
              schema:
                type: string
                description: Seconds to wait before retrying.
                example: '1'
              required: true
              description: Seconds to wait before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: RATE_LIMITED
                  message: Rate limit exceeded — retry after the delay in the `Retry-After` header.
  '/data/funds/{id}':
    get:
      operationId: getFund
      security:
        - oauth2:
            - 'read:entities'
        - bearerAuth:
            - 'read:entities'
      tags:
        - Funds
      summary: Get single fund
      description: >-
        Returns one fund by its stable Dealroom fund id, including the manager (GP) that raised it. `amount` is the fund size in the requested `?currency=` (default USD); `amount_source` carries the original native amount.
      parameters:
        - schema:
            type: string
            minLength: 1
            example: '901234'
            description: Numeric Dealroom fund ID.
          required: true
          description: Numeric Dealroom fund ID.
          name: id
          in: path
        - schema:
            type: string
            description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
            example: EUR
          required: false
          description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
          name: currency
          in: query
        - $ref: '#/components/parameters/ApiVersion'
      responses:
        '200':
          description: Single fund
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FundDetailResponse'
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '400':
          description: Invalid fund ID
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: VALIDATION_ERROR
                  message: The request was malformed or failed validation.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '401':
          description: >-
            Authentication required. The `Authorization` header was missing, the bearer token was malformed, or the token failed signature / expiry validation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: UNAUTHORIZED
                  message: Authentication required — provide a valid bearer token.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '403':
          description: >-
            Authentication succeeded but the caller's token does not include the permission required for this operation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FORBIDDEN
                  message: You do not have permission to perform this action.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '404':
          description: Fund not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: NOT_FOUND
                  message: The requested resource was not found.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '429':
          description: Rate limit exceeded.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
            Retry-After:
              schema:
                type: string
                description: Seconds to wait before retrying.
                example: '1'
              required: true
              description: Seconds to wait before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: RATE_LIMITED
                  message: Rate limit exceeded — retry after the delay in the `Retry-After` header.
  /data/founders:
    get:
      operationId: listFounders
      security:
        - oauth2:
            - 'read:founders'
        - bearerAuth:
            - 'read:founders'
      tags:
        - Founders
      summary: List founders
      description: >-
        Returns a paginated list of founders (entities with is_founder=true) with company associations, education history, and professional backgrounds. Supports the same filter syntax as other endpoints.
      parameters:
        - schema:
            type: string
            description: |
              Filter expression for founders using nested syntax.

              Examples:
              - Single: is_super_founder[eq]:true
              - AND: and(hq_location[eq]:233,is_promising_founder[eq]:true)

              Operators: eq, neq, gt, gte, lt, lte, in_any, nin_any
              in_all / nin_all are only available on repeated related-record filters.
              Default ref: 'entity' (can be omitted for entity filters)
            example: 'and(is_super_founder[eq]:true,hq_location[eq]:233)'
          required: false
          description: |
            Filter expression for founders using nested syntax.

            Examples:
            - Single: is_super_founder[eq]:true
            - AND: and(hq_location[eq]:233,is_promising_founder[eq]:true)

            Operators: eq, neq, gt, gte, lt, lte, in_any, nin_any
            in_all / nin_all are only available on repeated related-record filters.
            Default ref: 'entity' (can be omitted for entity filters)
          name: filter
          in: query
        - schema:
            type: integer
            format: int32
            minimum: 1
            maximum: 500
            default: 25
            description: 'Number of results to return (1-500, default 25)'
            example: 25
          required: false
          description: 'Number of results to return (1-500, default 25)'
          name: limit
          in: query
        - schema:
            type: integer
            format: int32
            minimum: 0
            default: 0
            description: >-
              Number of results to skip before returning data. Combine with `limit` for offset-based pagination.
            example: 0
          required: false
          description: >-
            Number of results to skip before returning data. Combine with `limit` for offset-based pagination.
          name: offset
          in: query
        - schema:
            type: string
            description: >-
              Opaque cursor token from a previous response's `page.next_cursor` or `page.prev_cursor`. Round-trip it as-is — do not decode or modify.
            example: eyJ2IjoxLCJkIjoibmV4dCJ9
          required: false
          description: >-
            Opaque cursor token from a previous response's `page.next_cursor` or `page.prev_cursor`. Round-trip it as-is — do not decode or modify.
          name: cursor
          in: query
        - schema:
            type: string
            pattern: '^-?[\w,]+$'
            description: >-
              Sort by one or more keys. Prefix with `-` for descending order; comma-separated for multi-key sorts.
            example: '-launch_date'
          required: false
          description: >-
            Sort by one or more keys. Prefix with `-` for descending order; comma-separated for multi-key sorts.
          name: sort
          in: query
        - schema:
            type: boolean
            description: >-
              Pass `true` to include `page.total` (the matching record count) in the response. Default omits the total to avoid a count query.
            example: true
          required: false
          description: >-
            Pass `true` to include `page.total` (the matching record count) in the response. Default omits the total to avoid a count query.
          name: include_total
          in: query
        - schema:
            type: string
            description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
            example: EUR
          required: false
          description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
          name: currency
          in: query
        - $ref: '#/components/parameters/ApiVersion'
      responses:
        '200':
          description: List of founders
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FounderListResponse'
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '401':
          description: >-
            Authentication required. The `Authorization` header was missing, the bearer token was malformed, or the token failed signature / expiry validation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: UNAUTHORIZED
                  message: Authentication required — provide a valid bearer token.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '403':
          description: >-
            Authentication succeeded but the caller's token does not include the permission required for this operation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FORBIDDEN
                  message: You do not have permission to perform this action.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '422':
          description: Validation error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FILTER_PARSE_ERROR
                  message: >-
                    The request could not be processed — check the filter syntax and any identifiers.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '429':
          description: Rate limit exceeded.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
            Retry-After:
              schema:
                type: string
                description: Seconds to wait before retrying.
                example: '1'
              required: true
              description: Seconds to wait before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: RATE_LIMITED
                  message: Rate limit exceeded — retry after the delay in the `Retry-After` header.
  '/data/founders/{id}':
    get:
      operationId: getFounder
      security:
        - oauth2:
            - 'read:founders'
        - bearerAuth:
            - 'read:founders'
      tags:
        - Founders
      summary: Get single founder
      description: >-
        Returns the full founder profile by UUID (numeric IDs are not accepted). Includes biographic details, founder badges (super founder, serial founder, etc.), professional history, education, and links to founded companies.
      parameters:
        - schema:
            type: string
            minLength: 1
            format: uuid
            example: 345d1ab6-33df-4759-9e17-0d0c0ec9ab1c
            description: Stable UUID of the entity. Numeric ids are not accepted.
          required: true
          description: Stable UUID of the entity. Numeric ids are not accepted.
          name: id
          in: path
        - $ref: '#/components/parameters/ApiVersion'
      responses:
        '200':
          description: Single founder
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FounderDetailResponse'
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '401':
          description: >-
            Authentication required. The `Authorization` header was missing, the bearer token was malformed, or the token failed signature / expiry validation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: UNAUTHORIZED
                  message: Authentication required — provide a valid bearer token.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '403':
          description: >-
            Authentication succeeded but the caller's token does not include the permission required for this operation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FORBIDDEN
                  message: You do not have permission to perform this action.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '404':
          description: Founder not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: NOT_FOUND
                  message: The requested resource was not found.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '429':
          description: Rate limit exceeded.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
            Retry-After:
              schema:
                type: string
                description: Seconds to wait before retrying.
                example: '1'
              required: true
              description: Seconds to wait before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: RATE_LIMITED
                  message: Rate limit exceeded — retry after the delay in the `Retry-After` header.
  '/data/founders/{id}/founded-companies':
    get:
      operationId: founderFoundedCompanies
      security:
        - oauth2:
            - 'read:founders'
        - bearerAuth:
            - 'read:founders'
      tags:
        - Founders
      summary: List founded companies
      description: >-
        The companies (and other organizations) this person founded — a preset over the person career relationship filtered to the founder role. Same row shape as `/data/people/{id}/career`, newest tenure first. Supports the same entity `?filter[...]` DSL as `/data/companies`.
      parameters:
        - schema:
            type: string
            minLength: 1
            format: uuid
            example: 345d1ab6-33df-4759-9e17-0d0c0ec9ab1c
            description: Stable UUID of the entity. Numeric ids are not accepted.
          required: true
          description: Stable UUID of the entity. Numeric ids are not accepted.
          name: id
          in: path
        - schema:
            type: string
            description: >
              Filter expression for the founded organizations — same syntax and keys as /data/companies.


              Operators: eq, neq, gt, gte, lt, lte, in_any, nin_any

              Default ref: 'entity'

            example: 'launch_date[gte]:2015'
          required: false
          description: >
            Filter expression for the founded organizations — same syntax and keys as /data/companies.


            Operators: eq, neq, gt, gte, lt, lte, in_any, nin_any

            Default ref: 'entity'

          name: filter
          in: query
        - schema:
            type: integer
            format: int32
            minimum: 1
            maximum: 500
            default: 25
            description: 'Number of results to return (1-500, default 25)'
            example: 25
          required: false
          description: 'Number of results to return (1-500, default 25)'
          name: limit
          in: query
        - schema:
            type: integer
            format: int32
            minimum: 0
            default: 0
            description: >-
              Number of results to skip before returning data. Combine with `limit` for offset-based pagination.
            example: 0
          required: false
          description: >-
            Number of results to skip before returning data. Combine with `limit` for offset-based pagination.
          name: offset
          in: query
        - schema:
            type: string
            pattern: '^-?[\w,]+$'
            description: >-
              Sort by one or more keys. Prefix with `-` for descending order; comma-separated for multi-key sorts.
            example: name
          required: false
          description: >-
            Sort by one or more keys. Prefix with `-` for descending order; comma-separated for multi-key sorts.
          name: sort
          in: query
        - schema:
            type: boolean
            description: >-
              Pass `true` to include `page.total` (the matching record count) in the response. Default omits the total to avoid a count query.
            example: true
          required: false
          description: >-
            Pass `true` to include `page.total` (the matching record count) in the response. Default omits the total to avoid a count query.
          name: include_total
          in: query
        - schema:
            type: string
            description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
            example: EUR
          required: false
          description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
          name: currency
          in: query
        - $ref: '#/components/parameters/ApiVersion'
      responses:
        '200':
          description: Companies founded by this person
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PersonCareerResponse'
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '400':
          description: Invalid entity ID
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: VALIDATION_ERROR
                  message: The request was malformed or failed validation.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '401':
          description: >-
            Authentication required. The `Authorization` header was missing, the bearer token was malformed, or the token failed signature / expiry validation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: UNAUTHORIZED
                  message: Authentication required — provide a valid bearer token.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '403':
          description: >-
            Authentication succeeded but the caller's token does not include the permission required for this operation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FORBIDDEN
                  message: You do not have permission to perform this action.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '429':
          description: Rate limit exceeded.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
            Retry-After:
              schema:
                type: string
                description: Seconds to wait before retrying.
                example: '1'
              required: true
              description: Seconds to wait before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: RATE_LIMITED
                  message: Rate limit exceeded — retry after the delay in the `Retry-After` header.
  /data/people:
    get:
      operationId: listPeople
      security:
        - oauth2:
            - 'read:people'
        - bearerAuth:
            - 'read:people'
      tags:
        - People
      summary: List people
      description: >-
        Returns a paginated list of all person entities (entity_type='person'), including company associations, education history, and professional backgrounds. Supports the same filter syntax as other endpoints.
      parameters:
        - schema:
            type: string
            description: |
              Filter expression for people using nested syntax.

              Examples:
              - Single: hq_location[eq]:233
              - AND: and(hq_location[eq]:233,is_super_founder[eq]:true)

              Operators: eq, neq, gt, gte, lt, lte, in_any, nin_any
              in_all / nin_all are only available on repeated related-record filters.
              Default ref: 'entity' (can be omitted for entity filters)
            example: 'hq_location[eq]:233'
          required: false
          description: |
            Filter expression for people using nested syntax.

            Examples:
            - Single: hq_location[eq]:233
            - AND: and(hq_location[eq]:233,is_super_founder[eq]:true)

            Operators: eq, neq, gt, gte, lt, lte, in_any, nin_any
            in_all / nin_all are only available on repeated related-record filters.
            Default ref: 'entity' (can be omitted for entity filters)
          name: filter
          in: query
        - schema:
            type: integer
            format: int32
            minimum: 1
            maximum: 500
            default: 25
            description: 'Number of results to return (1-500, default 25)'
            example: 25
          required: false
          description: 'Number of results to return (1-500, default 25)'
          name: limit
          in: query
        - schema:
            type: integer
            format: int32
            minimum: 0
            default: 0
            description: >-
              Number of results to skip before returning data. Combine with `limit` for offset-based pagination.
            example: 0
          required: false
          description: >-
            Number of results to skip before returning data. Combine with `limit` for offset-based pagination.
          name: offset
          in: query
        - schema:
            type: string
            description: >-
              Opaque cursor token from a previous response's `page.next_cursor` or `page.prev_cursor`. Round-trip it as-is — do not decode or modify.
            example: eyJ2IjoxLCJkIjoibmV4dCJ9
          required: false
          description: >-
            Opaque cursor token from a previous response's `page.next_cursor` or `page.prev_cursor`. Round-trip it as-is — do not decode or modify.
          name: cursor
          in: query
        - schema:
            type: string
            pattern: '^-?[\w,]+$'
            description: >-
              Sort by one or more keys. Prefix with `-` for descending order; comma-separated for multi-key sorts.
            example: '-launch_date'
          required: false
          description: >-
            Sort by one or more keys. Prefix with `-` for descending order; comma-separated for multi-key sorts.
          name: sort
          in: query
        - schema:
            type: boolean
            description: >-
              Pass `true` to include `page.total` (the matching record count) in the response. Default omits the total to avoid a count query.
            example: true
          required: false
          description: >-
            Pass `true` to include `page.total` (the matching record count) in the response. Default omits the total to avoid a count query.
          name: include_total
          in: query
        - schema:
            type: string
            description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
            example: EUR
          required: false
          description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
          name: currency
          in: query
        - $ref: '#/components/parameters/ApiVersion'
      responses:
        '200':
          description: List of people
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PersonListResponse'
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '401':
          description: >-
            Authentication required. The `Authorization` header was missing, the bearer token was malformed, or the token failed signature / expiry validation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: UNAUTHORIZED
                  message: Authentication required — provide a valid bearer token.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '403':
          description: >-
            Authentication succeeded but the caller's token does not include the permission required for this operation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FORBIDDEN
                  message: You do not have permission to perform this action.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '422':
          description: Validation error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FILTER_PARSE_ERROR
                  message: >-
                    The request could not be processed — check the filter syntax and any identifiers.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '429':
          description: Rate limit exceeded.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
            Retry-After:
              schema:
                type: string
                description: Seconds to wait before retrying.
                example: '1'
              required: true
              description: Seconds to wait before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: RATE_LIMITED
                  message: Rate limit exceeded — retry after the delay in the `Retry-After` header.
  '/data/people/{id}':
    get:
      operationId: getPerson
      security:
        - oauth2:
            - 'read:people'
        - bearerAuth:
            - 'read:people'
      tags:
        - People
      summary: Get single person
      description: >-
        Returns the full person profile by UUID (numeric IDs are not accepted). Covers all person entities (founders, executives, angels, and others). Includes biographic details, professional history, education, and background tags.
      parameters:
        - schema:
            type: string
            minLength: 1
            format: uuid
            example: 345d1ab6-33df-4759-9e17-0d0c0ec9ab1c
            description: Stable UUID of the entity. Numeric ids are not accepted.
          required: true
          description: Stable UUID of the entity. Numeric ids are not accepted.
          name: id
          in: path
        - $ref: '#/components/parameters/ApiVersion'
      responses:
        '200':
          description: Single person
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PersonDetailResponse'
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '401':
          description: >-
            Authentication required. The `Authorization` header was missing, the bearer token was malformed, or the token failed signature / expiry validation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: UNAUTHORIZED
                  message: Authentication required — provide a valid bearer token.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '403':
          description: >-
            Authentication succeeded but the caller's token does not include the permission required for this operation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FORBIDDEN
                  message: You do not have permission to perform this action.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '404':
          description: Person not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: NOT_FOUND
                  message: The requested resource was not found.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '429':
          description: Rate limit exceeded.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
            Retry-After:
              schema:
                type: string
                description: Seconds to wait before retrying.
                example: '1'
              required: true
              description: Seconds to wait before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: RATE_LIMITED
                  message: Rate limit exceeded — retry after the delay in the `Retry-After` header.
  '/data/people/{id}/career':
    get:
      operationId: personCareer
      security:
        - oauth2:
            - 'read:people'
        - bearerAuth:
            - 'read:people'
      tags:
        - People
      summary: List career history
      description: >-
        The companies and other organizations this person is or was associated with through the people_entities relationship — with their role flags (founder / executive / partner), title(s), and tenure at each. De-duplicated to one row per organization, current roles first. Use `?role=` to restrict to a single relationship role, and the same entity `?filter[...]` DSL as `/data/companies` to filter the organizations. Each row's `organization_subtype` links to the correct typed profile route.
      parameters:
        - schema:
            type: string
            minLength: 1
            format: uuid
            example: 345d1ab6-33df-4759-9e17-0d0c0ec9ab1c
            description: Stable UUID of the entity. Numeric ids are not accepted.
          required: true
          description: Stable UUID of the entity. Numeric ids are not accepted.
          name: id
          in: path
        - schema:
            type: string
            description: >
              Filter expression for the associated organizations — same syntax and keys as /data/companies.


              Examples:

              - Single: launch_date[gte]:2015

              - AND: and(launch_date[gte]:2015,hq_location[eq]:233)


              Operators: eq, neq, gt, gte, lt, lte, in_any, nin_any

              Default ref: 'entity'

            example: 'launch_date[gte]:2015'
          required: false
          description: >
            Filter expression for the associated organizations — same syntax and keys as /data/companies.


            Examples:

            - Single: launch_date[gte]:2015

            - AND: and(launch_date[gte]:2015,hq_location[eq]:233)


            Operators: eq, neq, gt, gte, lt, lte, in_any, nin_any

            Default ref: 'entity'

          name: filter
          in: query
        - schema:
            type: integer
            format: int32
            minimum: 1
            maximum: 500
            default: 25
            description: 'Number of results to return (1-500, default 25)'
            example: 25
          required: false
          description: 'Number of results to return (1-500, default 25)'
          name: limit
          in: query
        - schema:
            type: integer
            format: int32
            minimum: 0
            default: 0
            description: >-
              Number of results to skip before returning data. Combine with `limit` for offset-based pagination.
            example: 0
          required: false
          description: >-
            Number of results to skip before returning data. Combine with `limit` for offset-based pagination.
          name: offset
          in: query
        - schema:
            type: string
            pattern: '^-?[\w,]+$'
            description: >-
              Sort by one or more keys. Prefix with `-` for descending order; comma-separated for multi-key sorts.
            example: name
          required: false
          description: >-
            Sort by one or more keys. Prefix with `-` for descending order; comma-separated for multi-key sorts.
          name: sort
          in: query
        - schema:
            type: boolean
            description: >-
              Pass `true` to include `page.total` (the matching record count) in the response. Default omits the total to avoid a count query.
            example: true
          required: false
          description: >-
            Pass `true` to include `page.total` (the matching record count) in the response. Default omits the total to avoid a count query.
          name: include_total
          in: query
        - schema:
            type: string
            description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
            example: EUR
          required: false
          description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
          name: currency
          in: query
        - schema:
            type: string
            enum:
              - founder
              - executive
              - partner
            description: >-
              Restrict to a single relationship role at the associated organization: `founder`, `executive`, or `partner`. Omit to include all.
            example: founder
          required: false
          description: >-
            Restrict to a single relationship role at the associated organization: `founder`, `executive`, or `partner`. Omit to include all.
          name: role
          in: query
        - $ref: '#/components/parameters/ApiVersion'
      responses:
        '200':
          description: Person career history
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PersonCareerResponse'
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '400':
          description: Invalid entity ID
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: VALIDATION_ERROR
                  message: The request was malformed or failed validation.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '401':
          description: >-
            Authentication required. The `Authorization` header was missing, the bearer token was malformed, or the token failed signature / expiry validation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: UNAUTHORIZED
                  message: Authentication required — provide a valid bearer token.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '403':
          description: >-
            Authentication succeeded but the caller's token does not include the permission required for this operation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FORBIDDEN
                  message: You do not have permission to perform this action.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '422':
          description: Validation error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FILTER_PARSE_ERROR
                  message: >-
                    The request could not be processed — check the filter syntax and any identifiers.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '429':
          description: Rate limit exceeded.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
            Retry-After:
              schema:
                type: string
                description: Seconds to wait before retrying.
                example: '1'
              required: true
              description: Seconds to wait before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: RATE_LIMITED
                  message: Rate limit exceeded — retry after the delay in the `Retry-After` header.
  /data/news:
    get:
      operationId: listNews
      security:
        - oauth2:
            - 'read:news'
        - bearerAuth:
            - 'read:news'
      tags:
        - News
      summary: List news articles
      description: >-
        Returns a paginated list of published news articles. Articles can be about deals (VC rounds, IPOs, M&A), insights, events, partnerships, and more. Supports filtering by source, article type, sector, entity, and date range.
      parameters:
        - schema:
            type: string
            description: |
              Filter expression for news articles.

              Examples:
              - Single: source[eq]:perplexity
              - AND: and(article_type[eq]:vc_round,amount[gte]:1000000)
              - OR: or(source[eq]:perplexity,source[eq]:substack)

              Operators: eq, neq, gte, lte, gt, lt, in_any, nin_any
              Default ref: 'news'
            example: 'and(article_type[eq]:vc_round,amount[gte]:1000000)'
          required: false
          description: |
            Filter expression for news articles.

            Examples:
            - Single: source[eq]:perplexity
            - AND: and(article_type[eq]:vc_round,amount[gte]:1000000)
            - OR: or(source[eq]:perplexity,source[eq]:substack)

            Operators: eq, neq, gte, lte, gt, lt, in_any, nin_any
            Default ref: 'news'
          name: filter
          in: query
        - schema:
            type: integer
            format: int32
            minimum: 1
            maximum: 2000
            default: 25
            description: 'Number of results to return (1-2000, default 25)'
            example: 25
          required: false
          description: 'Number of results to return (1-2000, default 25)'
          name: limit
          in: query
        - schema:
            type: integer
            format: int32
            minimum: 0
            default: 0
            description: >-
              Number of results to skip before returning data. Combine with `limit` for offset-based pagination.
            example: 0
          required: false
          description: >-
            Number of results to skip before returning data. Combine with `limit` for offset-based pagination.
          name: offset
          in: query
        - schema:
            type: string
            description: >-
              Opaque cursor token from a previous response's `page.next_cursor` or `page.prev_cursor`. Round-trip it as-is — do not decode or modify.
            example: eyJ2IjoxLCJkIjoibmV4dCJ9
          required: false
          description: >-
            Opaque cursor token from a previous response's `page.next_cursor` or `page.prev_cursor`. Round-trip it as-is — do not decode or modify.
          name: cursor
          in: query
        - schema:
            type: string
            pattern: '^-?[\w,]+$'
            description: >-
              Sort by one or more keys. Prefix with `-` for descending order; comma-separated for multi-key sorts.
            example: '-publish_date'
          required: false
          description: >-
            Sort by one or more keys. Prefix with `-` for descending order; comma-separated for multi-key sorts.
          name: sort
          in: query
        - schema:
            type: boolean
            description: >-
              Pass `true` to include `page.total` (the matching record count) in the response. Default omits the total to avoid a count query.
            example: true
          required: false
          description: >-
            Pass `true` to include `page.total` (the matching record count) in the response. Default omits the total to avoid a count query.
          name: include_total
          in: query
        - schema:
            type: string
            description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
            example: EUR
          required: false
          description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
          name: currency
          in: query
        - $ref: '#/components/parameters/ApiVersion'
      responses:
        '200':
          description: List of news articles
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/NewsListResponse'
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '401':
          description: >-
            Authentication required. The `Authorization` header was missing, the bearer token was malformed, or the token failed signature / expiry validation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: UNAUTHORIZED
                  message: Authentication required — provide a valid bearer token.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '403':
          description: >-
            Authentication succeeded but the caller's token does not include the permission required for this operation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FORBIDDEN
                  message: You do not have permission to perform this action.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '422':
          description: Validation error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FILTER_PARSE_ERROR
                  message: >-
                    The request could not be processed — check the filter syntax and any identifiers.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '429':
          description: Rate limit exceeded.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
            Retry-After:
              schema:
                type: string
                description: Seconds to wait before retrying.
                example: '1'
              required: true
              description: Seconds to wait before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: RATE_LIMITED
                  message: Rate limit exceeded — retry after the delay in the `Retry-After` header.
  '/data/news/{id}':
    get:
      operationId: getNews
      security:
        - oauth2:
            - 'read:news'
        - bearerAuth:
            - 'read:news'
      tags:
        - News
      summary: Get single news article
      description: >-
        Returns one news article by numeric ID or slug, including its body excerpt, source, publish date, type, monetary amount (for deal articles, converted to the requested `?currency=`), and any linked Dealroom entities.
      parameters:
        - schema:
            type: string
            minLength: 1
            example: '8765432'
            description: Numeric Dealroom article ID or slug.
          required: true
          description: Numeric Dealroom article ID or slug.
          name: id
          in: path
        - schema:
            type: string
            description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
            example: EUR
          required: false
          description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
          name: currency
          in: query
        - $ref: '#/components/parameters/ApiVersion'
      responses:
        '200':
          description: Single news article
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/NewsDetailResponse'
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '401':
          description: >-
            Authentication required. The `Authorization` header was missing, the bearer token was malformed, or the token failed signature / expiry validation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: UNAUTHORIZED
                  message: Authentication required — provide a valid bearer token.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '403':
          description: >-
            Authentication succeeded but the caller's token does not include the permission required for this operation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FORBIDDEN
                  message: You do not have permission to perform this action.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '404':
          description: News article not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: NOT_FOUND
                  message: The requested resource was not found.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '429':
          description: Rate limit exceeded.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
            Retry-After:
              schema:
                type: string
                description: Seconds to wait before retrying.
                example: '1'
              required: true
              description: Seconds to wait before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: RATE_LIMITED
                  message: Rate limit exceeded — retry after the delay in the `Retry-After` header.
  /data/jobs:
    get:
      operationId: listJobs
      security:
        - oauth2:
            - 'read:jobs'
        - bearerAuth:
            - 'read:jobs'
      tags:
        - Jobs
      summary: List job openings
      description: >-
        > ⚠ **DATA INCOMPLETE** — `salary_min`, `salary_max`, `currency`, `department`, and `contract_type` are loaded from BigQuery but have <1% coverage (Predict Leads, ~99% of volume, does not supply them) and are intentionally not exposed in the API. The jobs table also covers active openings only (`expired = 0`).


        Returns a paginated list of active job openings, each joined to the hiring company. Supports filtering by entity, source, location (city/country/region IDs), and posted-date range. Sorted by `date_posted` descending by default.
      parameters:
        - schema:
            type: string
            description: >
              Filter expression for job openings.


              Examples:

              - Single: source[eq]:linkedin

              - AND: and(entity_id[eq]:345d1ab6-33df-4759-9e17-0d0c0ec9ab1c,date_posted[gte]:2024-01-01T00:00:00Z)

              - OR: or(country_id[eq]:2282,country_id[eq]:93)


              Operators: eq, neq, gte, lte, in_any, nin_any

              Default ref: 'jobs'

            example: >-
              and(entity_id[eq]:345d1ab6-33df-4759-9e17-0d0c0ec9ab1c,date_posted[gte]:2024-01-01T00:00:00Z)
          required: false
          description: >
            Filter expression for job openings.


            Examples:

            - Single: source[eq]:linkedin

            - AND: and(entity_id[eq]:345d1ab6-33df-4759-9e17-0d0c0ec9ab1c,date_posted[gte]:2024-01-01T00:00:00Z)

            - OR: or(country_id[eq]:2282,country_id[eq]:93)


            Operators: eq, neq, gte, lte, in_any, nin_any

            Default ref: 'jobs'

          name: filter
          in: query
        - schema:
            type: integer
            format: int32
            minimum: 1
            maximum: 2000
            default: 25
            description: 'Number of results to return (1-2000, default 25)'
            example: 25
          required: false
          description: 'Number of results to return (1-2000, default 25)'
          name: limit
          in: query
        - schema:
            type: integer
            format: int32
            minimum: 0
            default: 0
            description: >-
              Number of results to skip before returning data. Combine with `limit` for offset-based pagination.
            example: 0
          required: false
          description: >-
            Number of results to skip before returning data. Combine with `limit` for offset-based pagination.
          name: offset
          in: query
        - schema:
            type: string
            description: >-
              Opaque cursor token from a previous response's `page.next_cursor` or `page.prev_cursor`. Round-trip it as-is — do not decode or modify.
            example: eyJ2IjoxLCJkIjoibmV4dCJ9
          required: false
          description: >-
            Opaque cursor token from a previous response's `page.next_cursor` or `page.prev_cursor`. Round-trip it as-is — do not decode or modify.
          name: cursor
          in: query
        - schema:
            type: string
            pattern: '^-?[\w,]+$'
            description: >-
              Sort by one or more keys. Prefix with `-` for descending order; comma-separated for multi-key sorts.
            example: '-date_posted'
          required: false
          description: >-
            Sort by one or more keys. Prefix with `-` for descending order; comma-separated for multi-key sorts.
          name: sort
          in: query
        - schema:
            type: boolean
            description: >-
              Pass `true` to include `page.total` (the matching record count) in the response. Default omits the total to avoid a count query.
            example: true
          required: false
          description: >-
            Pass `true` to include `page.total` (the matching record count) in the response. Default omits the total to avoid a count query.
          name: include_total
          in: query
        - schema:
            type: string
            description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
            example: EUR
          required: false
          description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
          name: currency
          in: query
        - $ref: '#/components/parameters/ApiVersion'
      responses:
        '200':
          description: List of job openings
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/JobsListResponse'
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '401':
          description: >-
            Authentication required. The `Authorization` header was missing, the bearer token was malformed, or the token failed signature / expiry validation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: UNAUTHORIZED
                  message: Authentication required — provide a valid bearer token.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '403':
          description: >-
            Authentication succeeded but the caller's token does not include the permission required for this operation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FORBIDDEN
                  message: You do not have permission to perform this action.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '422':
          description: Validation error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FILTER_PARSE_ERROR
                  message: >-
                    The request could not be processed — check the filter syntax and any identifiers.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '429':
          description: Rate limit exceeded.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
            Retry-After:
              schema:
                type: string
                description: Seconds to wait before retrying.
                example: '1'
              required: true
              description: Seconds to wait before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: RATE_LIMITED
                  message: Rate limit exceeded — retry after the delay in the `Retry-After` header.
      x-data-status:
        kind: data-incomplete
        gapId: jobs-sparse-fields-unexposed
        reason: >-
          `salary_min`, `salary_max`, `currency`, `department`, and `contract_type` are loaded from BigQuery but have <1% coverage (Predict Leads, ~99% of volume, does not supply them) and are intentionally not exposed in the API. The jobs table also covers active openings only (`expired = 0`).
        observable: >-
          These fields never appear in the `/data/jobs` response; only well-populated fields (title, source, location, date_posted) are returned.
  '/data/jobs/{id}':
    get:
      operationId: getJob
      security:
        - oauth2:
            - 'read:jobs'
        - bearerAuth:
            - 'read:jobs'
      tags:
        - Jobs
      summary: Get single job opening
      description: >-
        > ⚠ **DATA INCOMPLETE** — Same as `listJobs`: `salary_min`, `salary_max`, `currency`, `department`, and `contract_type` are loaded but intentionally unexposed (<1% coverage), and the table covers active openings only (`expired = 0`).


        Returns one active job opening by numeric ID, joined to the hiring company.
      parameters:
        - schema:
            type: string
            minLength: 1
            example: '8765432'
            description: Numeric Dealroom job opening ID.
          required: true
          description: Numeric Dealroom job opening ID.
          name: id
          in: path
        - schema:
            type: string
            description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
            example: EUR
          required: false
          description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
          name: currency
          in: query
        - $ref: '#/components/parameters/ApiVersion'
      responses:
        '200':
          description: Single job opening
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/JobDetailResponse'
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '401':
          description: >-
            Authentication required. The `Authorization` header was missing, the bearer token was malformed, or the token failed signature / expiry validation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: UNAUTHORIZED
                  message: Authentication required — provide a valid bearer token.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '403':
          description: >-
            Authentication succeeded but the caller's token does not include the permission required for this operation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FORBIDDEN
                  message: You do not have permission to perform this action.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '404':
          description: Job opening not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: NOT_FOUND
                  message: The requested resource was not found.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '429':
          description: Rate limit exceeded.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
            Retry-After:
              schema:
                type: string
                description: Seconds to wait before retrying.
                example: '1'
              required: true
              description: Seconds to wait before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: RATE_LIMITED
                  message: Rate limit exceeded — retry after the delay in the `Retry-After` header.
      x-data-status:
        kind: data-incomplete
        gapId: jobs-detail-sparse-fields-unexposed
        reason: >-
          Same as `listJobs`: `salary_min`, `salary_max`, `currency`, `department`, and `contract_type` are loaded but intentionally unexposed (<1% coverage), and the table covers active openings only (`expired = 0`).
        observable: >-
          These fields never appear in the `/data/jobs/{id}` response; only well-populated fields are returned.
  /data/search:
    get:
      operationId: search
      security:
        - oauth2:
            - 'read:search'
        - bearerAuth:
            - 'read:search'
      tags:
        - Search
      summary: Search entities
      description: >-
        Searches entities by name and alias and returns a flat, relevance-ranked array of matches (best first). Each row carries its `type` (`company` | `investor` | `person` | `university` | `gov_ngo`) plus the display fields `website_domain`, `hq_city`, and `hq_country` (any of which may be null). Use the `types` parameter to limit the search to specific entity types; types the caller is not permitted to read are omitted from results.
      parameters:
        - schema:
            type: string
            minLength: 1
            description: Search term (minimum 1 character).
          required: true
          description: Search term (minimum 1 character).
          name: q
          in: query
        - schema:
            type: string
            description: >-
              Comma-separated entity types to search (investor, person, company, university, gov_ngo). Defaults to every type the caller is permitted to read.
            example: 'company,investor'
          required: false
          description: >-
            Comma-separated entity types to search (investor, person, company, university, gov_ngo). Defaults to every type the caller is permitted to read.
          name: types
          in: query
        - schema:
            type: number
            minimum: 1
            maximum: 20
            default: 5
            description: 'Maximum number of results per request (default 5, max 20)'
          required: false
          description: 'Maximum number of results per request (default 5, max 20)'
          name: limit
          in: query
        - $ref: '#/components/parameters/ApiVersion'
      responses:
        '200':
          description: 'Flat ranked results array, up to `limit` rows'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SearchResponse'
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '401':
          description: >-
            Authentication required. The `Authorization` header was missing, the bearer token was malformed, or the token failed signature / expiry validation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: UNAUTHORIZED
                  message: Authentication required — provide a valid bearer token.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '403':
          description: >-
            Authentication succeeded but the caller's token does not include the permission required for this operation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FORBIDDEN
                  message: You do not have permission to perform this action.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '422':
          description: Validation error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FILTER_PARSE_ERROR
                  message: >-
                    The request could not be processed — check the filter syntax and any identifiers.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '429':
          description: Rate limit exceeded.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
            Retry-After:
              schema:
                type: string
                description: Seconds to wait before retrying.
                example: '1'
              required: true
              description: Seconds to wait before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: RATE_LIMITED
                  message: Rate limit exceeded — retry after the delay in the `Retry-After` header.
  '/analytics/aggregate/{source}':
    get:
      operationId: sourceAggregate
      security:
        - oauth2:
            - 'read:aggregate'
        - bearerAuth:
            - 'read:aggregate'
      tags:
        - Aggregate
      summary: Aggregate by source
      description: >-
        Query a specific source (founders, investors, companies, funding-rounds, valuations, entities, fundings) with structured filter syntax.


        **Filter syntax** (`filter` param):

        - Single filter: `filter=key[op]:value`

        - AND: `filter=and(key1[op]:val1,key2[op]:val2)`

        - OR: `filter=or(key1[op]:val1,key2[op]:val2)`

        - Nested: `filter=and(tag_id[eq]:42,or(hq_location[eq]:81,hq_location[eq]:74))`


        **Available operators:** `eq`, `neq`, `gt`, `gte`, `lt`, `lte`, `in_any`, `nin_any`, `in_all`, `nin_all`

        `in_all` / `nin_all` are only exposed on repeated related-record filters.


        **Filter types:**

        - Direct: `launch_year[gte]:2020`, `total_funding[gt]:1000000`, `is_unicorn[eq]:true`

        - Location: `hq_location[eq]:81`, `hq_location[in_any]:1234|5678` (also `founding_location`, `office_location`, `founding_or_hq_location`)

        - Tag: `tag_id[eq]:42`, `tag_id[nin_any]:99`

        - Region: `region[eq]:123`


        **Examples:**

        - Count by country with tag: `?metric=count&group_by=hq_country&filter=tag_id[eq]:42`

        - Funded startups by year: `?metric=count&group_by=launch_year&filter=and(is_funded[eq]:true,launch_year[gte]:2015)`

        - Multi-dim: `?metric=sum:amount&group_by=year,hq_country`
      parameters:
        - schema:
            type: string
            enum:
              - founders
              - investors
              - companies
              - funding-rounds
              - valuations
              - entities
              - fundings
            description: >-
              The source to aggregate (founders, investors, companies, funding-rounds, valuations, entities, fundings)
            example: founders
          required: true
          description: >-
            The source to aggregate (founders, investors, companies, funding-rounds, valuations, entities, fundings)
          name: source
          in: path
        - schema:
            type: string
            description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
            example: EUR
          required: false
          description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
          name: currency
          in: query
        - schema:
            type: string
            minLength: 1
            description: >-
              Metric to compute: count, count_distinct:field, sum:field, avg:field, median:field, p25:field, p75:field
            example: count
          required: true
          description: >-
            Metric to compute: count, count_distinct:field, sum:field, avg:field, median:field, p25:field, p75:field
          name: metric
          in: query
        - schema:
            type: string
            minLength: 1
            pattern: '^[a-z][a-z0-9_.]*(?:,[a-z][a-z0-9_.]*)*$'
            description: >-
              Dimension(s) to group by. Location dims: hq_country, hq_city, hq_state, hq_continent, macro_region, region. Ecosystem map areas: map_area — the startup-map choropleth dimension (counts per polygon; requires an active ecosystem, else a validation error). Pair it with the per-entity map dots at GET /data/{companies|investors|universities}/geo. Relationship fields: university.name, employer.city. Multi-dim: year,hq_country
            example: hq_country
          required: true
          description: >-
            Dimension(s) to group by. Location dims: hq_country, hq_city, hq_state, hq_continent, macro_region, region. Ecosystem map areas: map_area — the startup-map choropleth dimension (counts per polygon; requires an active ecosystem, else a validation error). Pair it with the per-entity map dots at GET /data/{companies|investors|universities}/geo. Relationship fields: university.name, employer.city. Multi-dim: year,hq_country
          name: group_by
          in: query
        - schema:
            type: string
            description: >-
              Filter expression using structured syntax: and(key[op]:value,...), or(...). Example: and(tag_id[eq]:42,hq_location[eq]:81)
            example: 'and(tag_id[eq]:42,launch_year[gte]:2020)'
          required: false
          description: >-
            Filter expression using structured syntax: and(key[op]:value,...), or(...). Example: and(tag_id[eq]:42,hq_location[eq]:81)
          name: filter
          in: query
        - schema:
            type: string
            pattern: '^-?[a-z][a-z0-9_]*$'
            description: Sort by metric key or 'dimension'. Prefix with - for descending
            example: '-count'
          required: false
          description: Sort by metric key or 'dimension'. Prefix with - for descending
          name: sort
          in: query
        - schema:
            type: string
            description: 'Number of results to return (1-500, default 25)'
            example: '25'
          required: false
          description: 'Number of results to return (1-500, default 25)'
          name: limit
          in: query
        - $ref: '#/components/parameters/ApiVersion'
      responses:
        '200':
          description: Aggregated results
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AggregateResponse'
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '401':
          description: >-
            Authentication required. The `Authorization` header was missing, the bearer token was malformed, or the token failed signature / expiry validation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: UNAUTHORIZED
                  message: Authentication required — provide a valid bearer token.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '403':
          description: >-
            Authentication succeeded but the caller's token does not include the permission required for this operation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FORBIDDEN
                  message: You do not have permission to perform this action.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '422':
          description: Validation error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FILTER_PARSE_ERROR
                  message: >-
                    The request could not be processed — check the filter syntax and any identifiers.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '429':
          description: Rate limit exceeded.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
            Retry-After:
              schema:
                type: string
                description: Seconds to wait before retrying.
                example: '1'
              required: true
              description: Seconds to wait before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: RATE_LIMITED
                  message: Rate limit exceeded — retry after the delay in the `Retry-After` header.
  '/analytics/aggregate/{source}/multi-metric':
    get:
      operationId: multiMetric
      security:
        - oauth2:
            - 'read:aggregate'
        - bearerAuth:
            - 'read:aggregate'
      tags:
        - Aggregate
      summary: Multi-metric aggregate
      description: >-
        Return multiple labeled metrics from a single SQL query, each with optional per-metric

        filters using aggregate FILTER (WHERE ...) clauses. Supports all metric types (COUNT, SUM,

        AVG, MEDIAN, MAX) and optional dimensional grouping (group_by).


        **Metric param format:** `metric=<label>,<metric_type>`

        - First segment = label (lowercase alphanumeric + underscore)

        - Second segment = metric type (e.g., `count`, `sum:total_funding`, `percentage:label_a/label_b`)


        **Percentage metrics** (`percentage:numerator/denominator`): Computes `ROUND(numerator * 100.0 / NULLIF(denominator, 0), 2)`.

        - Both referenced labels must be defined as non-percentage metrics in the same request.

        - Percentage metrics cannot have per-metric filters (apply filters to the referenced metrics instead).

        - Example: `metric=filtered,count&metric=total,count&metric=pct,percentage:filtered/total`


        **Per-metric filters** (`metric_filter` param): `metric_filter=<label>:<filter_expression>`

        - Uses the same AST filter syntax as the shared `filter` param

        - Example: `metric_filter=unicorns:is_unicorn[eq]:true`

        - Compound: `metric_filter=funded:and(total_funding[gte]:100000,is_vc_backed[eq]:true)`


        **group_by** (optional): Dimension(s) to group by, comma-separated.

        **sort** (optional): Sort by metric label or `dimension`. Prefix `-` for descending (default).

        **limit** (optional): Max results when grouped (1-500, default 25).


        **Post-aggregation filter** (`metric_having` param): Filter grouped rows by metric values.

        - Format: `metric_having=<label>[op]:<value>` where op is gt, gte, lt, lte, eq, neq

        - Repeatable for multiple conditions (AND semantics)

        - Only valid when `group_by` is present

        - Example: `metric_having=percentage[gt]:25&metric_having=filtered[gte]:5`


        **Shared filters** (`filter` param): Uses structured AST syntax, same as `/analytics/aggregate/:source`.

        - Single filter: `filter=tag_id[eq]:42`

        - AND: `filter=and(tag_id[eq]:42,launch_year[gte]:2020)`

        - OR: `filter=or(hq_location[eq]:133,hq_location[eq]:75)`


        **Example — mixed metrics with group_by:**

        ```

        GET /analytics/aggregate/companies/multi-metric

          ?metric=total,count
          &metric=unicorns,count
          &metric=unicorn_funding,sum:total_funding
          &metric_filter=unicorns:is_unicorn[eq]:true
          &metric_filter=unicorn_funding:is_unicorn[eq]:true
          &group_by=hq_country
          &sort=-total
          &limit=10
          &filter=launch_year[gte]:2015
        ```


        **Example — flat (no group_by):**

        ```

        GET /analytics/aggregate/companies/multi-metric

          ?metric=total,count
          &metric=unicorns,count
          &metric=unicorn_funding,sum:total_funding
          &metric_filter=unicorns:is_unicorn[eq]:true
          &metric_filter=unicorn_funding:is_unicorn[eq]:true
        ```

        Returns: `{ data: [{ total: 52341, unicorns: 1287, unicorn_funding: 3400000000000 }], query_info: { source: "companies", metrics: [...] } }` — note that `data` is a single-element array even for the flat (no-group_by) variant, for shape consistency with the grouped response.
      parameters:
        - schema:
            type: string
            enum:
              - founders
              - investors
              - companies
              - funding-rounds
              - valuations
              - entities
              - fundings
            description: The source to aggregate
            example: companies
          required: true
          description: The source to aggregate
          name: source
          in: path
        - schema:
            type: string
            description: ISO 4217 currency code for monetary metric conversion. Defaults to USD.
            example: EUR
          required: false
          description: ISO 4217 currency code for monetary metric conversion. Defaults to USD.
          name: currency
          in: query
        - schema:
            anyOf:
              - type: string
                minLength: 1
              - type: array
                items:
                  type: string
                  minLength: 1
                minItems: 1
            description: >-
              Metric definition: label,metric_type. Repeat for multiple metrics. Types: count, count_distinct:field, sum:field, avg:field, median:field, p25:field, p75:field, percentage:numerator_label/denominator_label. Example: metric=total,count&metric=unicorns,count&metric=pct,percentage:unicorns/total
            example: 'total,count'
          required: true
          description: >-
            Metric definition: label,metric_type. Repeat for multiple metrics. Types: count, count_distinct:field, sum:field, avg:field, median:field, p25:field, p75:field, percentage:numerator_label/denominator_label. Example: metric=total,count&metric=unicorns,count&metric=pct,percentage:unicorns/total
          name: metric
          in: query
          example: 'total,count'
        - schema:
            anyOf:
              - type: string
                minLength: 1
              - type: array
                items:
                  type: string
                  minLength: 1
                minItems: 1
            description: >-
              Per-metric filter expression: <label>:<filter_expression>. Example: metric_filter=unicorns:is_unicorn[eq]:true
            example: 'unicorns:is_unicorn[eq]:true'
          required: false
          description: >-
            Per-metric filter expression: <label>:<filter_expression>. Example: metric_filter=unicorns:is_unicorn[eq]:true
          name: metric_filter
          in: query
        - schema:
            anyOf:
              - type: string
                minLength: 1
              - type: array
                items:
                  type: string
                  minLength: 1
                minItems: 1
            description: >-
              Post-aggregation filter: <label>[op]:<value>. Operators: gt, gte, lt, lte, eq, neq. Only valid with group_by. Example: metric_having=percentage[gt]:25
            example: 'percentage[gt]:25'
          required: false
          description: >-
            Post-aggregation filter: <label>[op]:<value>. Operators: gt, gte, lt, lte, eq, neq. Only valid with group_by. Example: metric_having=percentage[gt]:25
          name: metric_having
          in: query
        - schema:
            type: string
            minLength: 1
            pattern: '^[a-z][a-z0-9_.]*(?:,[a-z][a-z0-9_.]*)*$'
            description: >-
              Dimension(s) to group by, comma-separated. Omit for flat aggregation. Includes map_area — the startup-map choropleth dimension (requires an active ecosystem); its per-entity dots counterpart is GET /data/{companies|investors|universities}/geo.
            example: hq_country
          required: false
          description: >-
            Dimension(s) to group by, comma-separated. Omit for flat aggregation. Includes map_area — the startup-map choropleth dimension (requires an active ecosystem); its per-entity dots counterpart is GET /data/{companies|investors|universities}/geo.
          name: group_by
          in: query
          example: hq_country
        - schema:
            type: string
            description: >-
              Filter expression: and(key[op]:value,...), or(...). Example: and(tag_id[eq]:42,launch_year[gte]:2020)
            example: 'and(tag_id[eq]:42,launch_year[gte]:2020)'
          required: false
          description: >-
            Filter expression: and(key[op]:value,...), or(...). Example: and(tag_id[eq]:42,launch_year[gte]:2020)
          name: filter
          in: query
        - schema:
            type: string
            pattern: '^-?[a-z][a-z0-9_]*$'
            description: Sort by metric label or 'dimension'. Prefix with - for descending
            example: '-total'
          required: false
          description: Sort by metric label or 'dimension'. Prefix with - for descending
          name: sort
          in: query
          example: '-total'
        - schema:
            type: string
            description: 'Number of results to return (1-500, default 25)'
            example: '25'
          required: false
          description: 'Number of results to return (1-500, default 25)'
          name: limit
          in: query
          example: '25'
        - $ref: '#/components/parameters/ApiVersion'
      responses:
        '200':
          description: Multi-metric results (grouped or flat depending on group_by)
          content:
            application/json:
              schema:
                anyOf:
                  - $ref: '#/components/schemas/MultiMetricGroupedResponse'
                  - $ref: '#/components/schemas/MultiMetricFlatResponse'
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '401':
          description: >-
            Authentication required. The `Authorization` header was missing, the bearer token was malformed, or the token failed signature / expiry validation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: UNAUTHORIZED
                  message: Authentication required — provide a valid bearer token.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '403':
          description: >-
            Authentication succeeded but the caller's token does not include the permission required for this operation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FORBIDDEN
                  message: You do not have permission to perform this action.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '422':
          description: Validation error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FILTER_PARSE_ERROR
                  message: >-
                    The request could not be processed — check the filter syntax and any identifiers.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '429':
          description: Rate limit exceeded.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
            Retry-After:
              schema:
                type: string
                description: Seconds to wait before retrying.
                example: '1'
              required: true
              description: Seconds to wait before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: RATE_LIMITED
                  message: Rate limit exceeded — retry after the delay in the `Retry-After` header.
  /analytics/timeseries:
    get:
      operationId: getTimeseries
      security:
        - oauth2:
            - 'read:timeseries'
        - bearerAuth:
            - 'read:timeseries'
      tags:
        - Timeseries
      summary: Timeseries
      description: >-
        Returns yearly values for a single metric across filtered entities.


        **Value metrics:** `employees`, `revenue`, `valuation`, `ebitda`, `vc_funding` — aggregated per year with the chosen aggregation.


        **Count metrics:** `unicorns` (from `entities.year_became_unicorn`) and `vc_backed` (from a company's first VC-type funding round) — a cumulative count of companies that had reached the status as of each year. The `aggregation` param is ignored for these.


        **Aggregations:** `sum` (default), `avg`, `median`, `count`


        **Entity filters:** Use the `filter` parameter with the same syntax as `/analytics/aggregate/:source`.

        Filters apply to entity-level fields (e.g. `launch_year`, `total_funding`).


        **Grouping is not supported** — this endpoint returns a single ungrouped series for the requested `metric`; a `group_by` parameter, if provided, is ignored. For grouped aggregations use `/analytics/aggregate/:source` with `group_by`.
      parameters:
        - schema:
            type: string
            enum:
              - employees
              - revenue
              - valuation
              - ebitda
              - vc_funding
              - unicorns
              - vc_backed
            description: >-
              Metric to return per year. Value metrics are aggregated; count metrics (e.g. `unicorns`) return a cumulative count.
            example: revenue
          required: true
          description: >-
            Metric to return per year. Value metrics are aggregated; count metrics (e.g. `unicorns`) return a cumulative count.
          name: metric
          in: query
        - schema:
            type: string
            enum:
              - sum
              - avg
              - median
              - count
            default: sum
            description: 'Aggregation function to apply (default: sum)'
            example: sum
          required: false
          description: 'Aggregation function to apply (default: sum)'
          name: aggregation
          in: query
        - schema:
            type: string
            pattern: ^\d+$
            description: Minimum year (inclusive)
            example: '2018'
          required: false
          description: Minimum year (inclusive)
          name: year_min
          in: query
        - schema:
            type: string
            pattern: ^\d+$
            description: Maximum year (inclusive)
            example: '2024'
          required: false
          description: Maximum year (inclusive)
          name: year_max
          in: query
        - schema:
            type: string
            description: 'Entity filter expression: key[op]:value. Same syntax as /analytics/aggregate/:source'
            example: 'total_funding[gte]:1000000'
          required: false
          description: 'Entity filter expression: key[op]:value. Same syntax as /analytics/aggregate/:source'
          name: filter
          in: query
        - schema:
            type: string
            description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
            example: EUR
          required: false
          description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
          name: currency
          in: query
        - $ref: '#/components/parameters/ApiVersion'
      responses:
        '200':
          description: Yearly aggregated metric values
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TimeseriesResponse'
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '401':
          description: >-
            Authentication required. The `Authorization` header was missing, the bearer token was malformed, or the token failed signature / expiry validation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: UNAUTHORIZED
                  message: Authentication required — provide a valid bearer token.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '403':
          description: >-
            Authentication succeeded but the caller's token does not include the permission required for this operation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FORBIDDEN
                  message: You do not have permission to perform this action.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '422':
          description: Validation error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FILTER_PARSE_ERROR
                  message: >-
                    The request could not be processed — check the filter syntax and any identifiers.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '429':
          description: Rate limit exceeded.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
            Retry-After:
              schema:
                type: string
                description: Seconds to wait before retrying.
                example: '1'
              required: true
              description: Seconds to wait before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: RATE_LIMITED
                  message: Rate limit exceeded — retry after the delay in the `Retry-After` header.
  /reference/filters:
    get:
      operationId: filters
      security:
        - oauth2:
            - 'read:dimensions'
        - bearerAuth:
            - 'read:dimensions'
      tags:
        - Filters
      summary: List filters
      description: >-
        Returns available filters for the given scope with category grouping, operators, and optional user-facing descriptions and examples. Valid scopes: companies, investors, transactions, people, universities, gov_ngo, news, jobs, funds.
      parameters:
        - schema:
            type: string
            enum:
              - companies
              - investors
              - transactions
              - people
              - universities
              - gov_ngo
              - news
              - jobs
              - funds
            description: >-
              Required. One of: companies, investors, transactions, people, universities, gov_ngo, news, jobs, funds
            example: companies
          required: true
          description: >-
            Required. One of: companies, investors, transactions, people, universities, gov_ngo, news, jobs, funds
          name: scope
          in: query
        - $ref: '#/components/parameters/ApiVersion'
      responses:
        '200':
          description: Available filters with category metadata
          content:
            application/json:
              example:
                data:
                  - key: tag_id
                    label: Tags
                    description: 'Find companies by sector, industry, technology, or other tags.'
                    description_long: >-
                      Use tags to narrow companies by Dealroom's taxonomy. Combine multiple tag IDs with multi-value operators.
                    examples:
                      - value: 42
                        label: Fintech
                      - value: 123
                        label: Climate
                    type: id_lookup
                    category: Sectors
                    operators:
                      - eq
                      - neq
                      - in_any
                      - in_all
                      - nin_any
                      - nin_all
                    supports_type_filter: true
                    sub_types:
                      - key: industry
                        label: Industries
                      - key: technology
                        label: Technologies
                      - key: sector
                        label: Sectors
                  - key: launch_date
                    label: Founded Year
                    type: date
                    category: Company Info
                    operators:
                      - gte
                      - lte
                      - between
                  - key: is_vc_backed
                    label: VC Backed
                    type: boolean
                    category: Funding
                    operators:
                      - eq
              schema:
                $ref: '#/components/schemas/FiltersResponse'
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '401':
          description: >-
            Authentication required. The `Authorization` header was missing, the bearer token was malformed, or the token failed signature / expiry validation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: UNAUTHORIZED
                  message: Authentication required — provide a valid bearer token.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '403':
          description: >-
            Authentication succeeded but the caller's token does not include the permission required for this operation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FORBIDDEN
                  message: You do not have permission to perform this action.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '429':
          description: Rate limit exceeded.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
            Retry-After:
              schema:
                type: string
                description: Seconds to wait before retrying.
                example: '1'
              required: true
              description: Seconds to wait before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: RATE_LIMITED
                  message: Rate limit exceeded — retry after the delay in the `Retry-After` header.
  /reference/filters/search:
    get:
      operationId: filterSearch
      security:
        - oauth2:
            - 'read:dimensions'
        - bearerAuth:
            - 'read:dimensions'
      tags:
        - Filters
      summary: Search filters and values
      description: >-
        Returns the picker-ready search result set for one scope: year-intent matches, value matches across every searchable dimension, and filter-name/description matches. Single round-trip replacement for the client-side fan-out across `/reference/filters/:key/values`.
      parameters:
        - schema:
            type: string
            enum:
              - companies
              - investors
              - transactions
              - people
              - universities
              - gov_ngo
              - news
              - jobs
              - funds
            description: >-
              Required. One of: companies, investors, transactions, people, universities, gov_ngo, news, jobs, funds
            example: companies
          required: true
          description: >-
            Required. One of: companies, investors, transactions, people, universities, gov_ngo, news, jobs, funds
          name: scope
          in: query
        - schema:
            type: string
            minLength: 1
            description: >-
              Search query (min 1 char). Filter labels and year heuristics are matched immediately; value lookup starts at 3 chars.
            example: fintech
          required: true
          description: >-
            Search query (min 1 char). Filter labels and year heuristics are matched immediately; value lookup starts at 3 chars.
          name: q
          in: query
        - schema:
            type: string
            description: 'Max value matches per picker row (1-10, default 3)'
            example: '3'
          required: false
          description: 'Max value matches per picker row (1-10, default 3)'
          name: limit_per_row
          in: query
        - schema:
            type: string
            description: 'Total result cap (1-50, default 20)'
            example: '20'
          required: false
          description: 'Total result cap (1-50, default 20)'
          name: limit
          in: query
        - $ref: '#/components/parameters/ApiVersion'
      responses:
        '200':
          description: Search matches in tier-and-row order
          content:
            application/json:
              example:
                data:
                  - kind: value
                    filter_key: tag_id
                    filter_picker_key: 'tag_id:industry'
                    filter_label: Industries
                    pinned_sub_type: industry
                    label: Fintech
                    value: '42'
                    entity_count: 1200
                    source_type: industry
                  - kind: year
                    filter_key: launch_date
                    filter_picker_key: launch_date
                    filter_label: Founded Year
                    label: 'Founded Year: After 2020'
                    value: '2020'
                    operator: gte
                  - kind: filter
                    filter_key: tag_id
                    filter_picker_key: 'tag_id:sector'
                    filter_label: Sectors
                    pinned_sub_type: sector
                    category: Sectors
              schema:
                $ref: '#/components/schemas/FilterSearchResponse'
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '401':
          description: >-
            Authentication required. The `Authorization` header was missing, the bearer token was malformed, or the token failed signature / expiry validation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: UNAUTHORIZED
                  message: Authentication required — provide a valid bearer token.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '403':
          description: >-
            Authentication succeeded but the caller's token does not include the permission required for this operation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FORBIDDEN
                  message: You do not have permission to perform this action.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '429':
          description: Rate limit exceeded.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
            Retry-After:
              schema:
                type: string
                description: Seconds to wait before retrying.
                example: '1'
              required: true
              description: Seconds to wait before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: RATE_LIMITED
                  message: Rate limit exceeded — retry after the delay in the `Retry-After` header.
  '/reference/filters/{key}/values':
    get:
      operationId: filterValues
      security:
        - oauth2:
            - 'read:dimensions'
        - bearerAuth:
            - 'read:dimensions'
      tags:
        - Filters
      summary: List filter values
      description: >-
        Returns values for a filter with entity counts. Supports fuzzy search, pagination, and optional metadata enrichment. Only filters with type id_lookup or enum have values.
      parameters:
        - schema:
            type: string
            example: tag_id
          required: true
          name: key
          in: path
        - schema:
            type: string
            minLength: 2
            description: Fuzzy search (min 2 chars)
            example: fintech
          required: false
          description: Fuzzy search (min 2 chars)
          name: q
          in: query
        - schema:
            type: string
            minLength: 2
            maxLength: 500
            description: >-
              Semantic ranking phrase — ranks values by gemini-embedding-001 cosine distance instead of lexical search. Tag dimensions only; ignored elsewhere.
            example: fintech lending
          required: false
          description: >-
            Semantic ranking phrase — ranks values by gemini-embedding-001 cosine distance instead of lexical search. Tag dimensions only; ignored elsewhere.
          name: semantic
          in: query
        - schema:
            type: string
            description: 'Sub-type filter (e.g. industry for tags, country for locations)'
            example: industry
          required: false
          description: 'Sub-type filter (e.g. industry for tags, country for locations)'
          name: type
          in: query
        - schema:
            type: string
            description: 'Results per page (1-1000, default 100)'
            example: '100'
          required: false
          description: 'Results per page (1-1000, default 100)'
          name: limit
          in: query
        - schema:
            type: string
            example: '0'
          required: false
          name: offset
          in: query
        - schema:
            type: string
            description: 'Comma-separated enrichments: geo, description'
            example: geo
          required: false
          description: 'Comma-separated enrichments: geo, description'
          name: include
          in: query
        - schema:
            type: string
            pattern: '^[\w-]+(\|[\w-]+)*$'
            description: Pipe-separated IDs to always include
            example: 42|123
          required: false
          description: Pipe-separated IDs to always include
          name: ids
          in: query
        - schema:
            type: string
            description: >-
              Serialized filter expression (same format as entity list endpoints). When provided, entity_count reflects how many results remain with these filters applied.
            example: 'hq_location[eq]:233'
          required: false
          description: >-
            Serialized filter expression (same format as entity list endpoints). When provided, entity_count reflects how many results remain with these filters applied.
          name: filter
          in: query
        - schema:
            type: string
            enum:
              - companies
              - investors
              - transactions
              - people
              - universities
              - gov_ngo
              - news
              - jobs
              - funds
            description: >-
              Filter scope (same as discovery/search). Aligns contextual entity_count with the scoped list endpoint — relationship-path keys, defaults, and baselines. Defaults to companies.
            example: companies
          required: false
          description: >-
            Filter scope (same as discovery/search). Aligns contextual entity_count with the scoped list endpoint — relationship-path keys, defaults, and baselines. Defaults to companies.
          name: scope
          in: query
        - schema:
            type: boolean
            description: >-
              Pass `true` to populate `entity_count` on each value. Default leaves it `null` to avoid the count query.
            example: true
          required: false
          description: >-
            Pass `true` to populate `entity_count` on each value. Default leaves it `null` to avoid the count query.
          name: include_counts
          in: query
        - $ref: '#/components/parameters/ApiVersion'
      responses:
        '200':
          description: Filter values with entity counts
          content:
            application/json:
              example:
                data:
                  - id: 42
                    code: industry/fintech
                    name: Fintech
                    entity_count: 1200
                    type: industry
                  - id: 87
                    code: industry/financial-services
                    name: Financial Services
                    entity_count: 890
                    type: industry
                page:
                  total: 2
                  limit: 100
                  offset: 0
                  has_more: false
              schema:
                $ref: '#/components/schemas/FilterValuesResponse'
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '401':
          description: >-
            Authentication required. The `Authorization` header was missing, the bearer token was malformed, or the token failed signature / expiry validation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: UNAUTHORIZED
                  message: Authentication required — provide a valid bearer token.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '403':
          description: >-
            Authentication succeeded but the caller's token does not include the permission required for this operation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FORBIDDEN
                  message: You do not have permission to perform this action.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '422':
          description: Filter key not found or does not support value lookup
          content:
            application/json:
              example:
                error:
                  code: VALIDATION_ERROR
                  message: Filter 'launch_date' does not support value lookup
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '429':
          description: Rate limit exceeded.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
            Retry-After:
              schema:
                type: string
                description: Seconds to wait before retrying.
                example: '1'
              required: true
              description: Seconds to wait before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: RATE_LIMITED
                  message: Rate limit exceeded — retry after the delay in the `Retry-After` header.
webhooks: {}
x-public-contract: true
