Multiples
Private Companies and DealsLookup and references

Transaction Filters and Vocabulary

Introduction

GET /lookup/transactions is the discovery endpoint for the transactions resource. It returns the exact set of filter fields you can send to POST /transactions and POST /transactions/aggregate, the type and operators each field accepts, the enum vocabulary for category fields (deal types, deal subtypes, regions), the valid sort keys, and the aggregate methodology constants (metrics, time buckets, small-sample suppression, outlier rule).

The lookup does not list values for target_country, target_verticals, target_themes, target_client_focus, target_revenue_model and target_company_type. Their full lists are on Filter values. A value must match exactly. An unknown value returns 400. It does not return an empty page. The error suggests a fix where it can: a case mismatch gets the correctly cased value, a country name gets its ISO code ("Germany" suggests "DEU"), a region sent as target_country (or a country code sent as target_region) points to the right field, and a misspelt value of 4 or more characters gets the closest matches. An unknown 3-letter country code gets no suggestion. Otherwise the error links to the filter values page.

Call it once to drive a UI's filter controls or to confirm valid values before building a query - it returns no transaction data itself.

Set up

Endpoint

GET https://multiples.vc/api/private/v1/lookup/transactions

Request - no path or query parameters. This is a static vocabulary document; a single authenticated call returns everything.

GET https://multiples.vc/api/private/v1/lookup/transactions

There is nothing to filter or paginate. The shape of the response is fixed; the enum values lists are fixed in the API and change only when we add a category.

How to read the result - each entry in filters tells you how to use that field on POST /transactions:

elementmeaning
fieldThe key to put in the filters object of your transactions request (date_from / date_to and the rest are all keys inside that same filters object).
typeValue type the field expects (see types below).
operatorsHow the value is matched. in = match any of the listed values; overlaps = array shares at least one value; contains = array contains every listed value ({"all": ["A", "B"]}); gte / lte = lower / upper bound; eq = exact match.
valuesPresent only on enum-backed fields. The full allowed vocabulary - send values exactly as shown.
descriptionPresent only on fields that need a usage note (units, change-feed semantics, tag matching, rejected values).

Field type values you will see here: array_uuid, array_string, number, date, datetime, boolean.

Response - the live document (this endpoint returns no null/empty keys to drop):

{
  "data": {
    "filters": [
      {
        "field": "id",
        "type": "array_uuid",
        "operators": [
          "in"
        ]
      },
      {
        "field": "target_id",
        "type": "array_uuid",
        "operators": [
          "in"
        ]
      },
      {
        "field": "investor_id",
        "type": "array_uuid",
        "operators": [
          "in"
        ],
        "description": "Companies that took part in the deal in any role: lead investor, other investor or buyer."
      },
      {
        "field": "deal_type",
        "type": "array_string",
        "operators": [
          "in"
        ],
        "values": [
          "Early",
          "Growth",
          "M&A",
          "Public listing",
          "Secondary",
          "Venture",
          "Write-down"
        ],
        "description": "Unknown values are rejected. Write-down is a valuation event (a holder's impairment of its stake, or insolvency at 0), not a transaction: transactions never include it, it only sets the company's latest valuation."
      },
      {
        "field": "deal_subtype",
        "type": "array_string",
        "operators": [
          "in"
        ],
        "values": [
          "Angel",
          "ICO",
          "Impairment",
          "Insolvency",
          "PE buyout",
          "Pre-seed",
          "Secondary - private",
          "Secondary - public",
          "Seed",
          "Series A",
          "Series B",
          "Series C",
          "Series D",
          "Series E",
          "Series F",
          "Series G",
          "Series H",
          "Series I",
          "Series J",
          "Strategic M&A",
          "Strategic investment",
          "Undisclosed stage"
        ],
        "description": "Unknown values are rejected. Impairment and Insolvency are the Write-down subtypes and match no transaction."
      },
      {
        "field": "date_from",
        "type": "date",
        "operators": [
          "gte"
        ]
      },
      {
        "field": "date_to",
        "type": "date",
        "operators": [
          "lte"
        ]
      },
      {
        "field": "valuation_min",
        "type": "number",
        "operators": [
          "gte"
        ],
        "description": "Millions USD."
      },
      {
        "field": "valuation_max",
        "type": "number",
        "operators": [
          "lte"
        ]
      },
      {
        "field": "raised_min",
        "type": "number",
        "operators": [
          "gte"
        ]
      },
      {
        "field": "raised_max",
        "type": "number",
        "operators": [
          "lte"
        ]
      },
      {
        "field": "revenue_min",
        "type": "number",
        "operators": [
          "gte"
        ]
      },
      {
        "field": "revenue_max",
        "type": "number",
        "operators": [
          "lte"
        ]
      },
      {
        "field": "ebitda_min",
        "type": "number",
        "operators": [
          "gte"
        ]
      },
      {
        "field": "ebitda_max",
        "type": "number",
        "operators": [
          "lte"
        ]
      },
      {
        "field": "ev_revenue_min",
        "type": "number",
        "operators": [
          "gte"
        ]
      },
      {
        "field": "ev_revenue_max",
        "type": "number",
        "operators": [
          "lte"
        ]
      },
      {
        "field": "ev_ebitda_min",
        "type": "number",
        "operators": [
          "gte"
        ]
      },
      {
        "field": "ev_ebitda_max",
        "type": "number",
        "operators": [
          "lte"
        ]
      },
      {
        "field": "target_country",
        "type": "array_string",
        "operators": [
          "in"
        ],
        "description": "ISO-3 country codes. Unknown values are rejected."
      },
      {
        "field": "target_region",
        "type": "array_string",
        "operators": [
          "in"
        ],
        "values": [
          "Africa",
          "Central Asia",
          "East Asia",
          "Eastern Europe",
          "Latin America",
          "Middle East",
          "North America",
          "Northern Europe",
          "Oceania",
          "South Asia",
          "South-East Asia",
          "Southern Europe",
          "Western Europe"
        ],
        "description": "Unknown values are rejected."
      },
      {
        "field": "target_verticals",
        "type": "array_string",
        "operators": [
          "overlaps",
          "contains"
        ],
        "description": "A plain array matches any listed value. {\"all\": [\"A\", \"B\"]} matches records tagged with every listed value. Unknown values are rejected."
      },
      {
        "field": "target_themes",
        "type": "array_string",
        "operators": [
          "overlaps",
          "contains"
        ],
        "description": "A plain array matches any listed value. {\"all\": [\"A\", \"B\"]} matches records tagged with every listed value. Unknown values are rejected."
      },
      {
        "field": "target_client_focus",
        "type": "array_string",
        "operators": [
          "overlaps",
          "contains"
        ],
        "description": "A plain array matches any listed value. {\"all\": [\"A\", \"B\"]} matches records tagged with every listed value. Unknown values are rejected."
      },
      {
        "field": "target_revenue_model",
        "type": "array_string",
        "operators": [
          "overlaps",
          "contains"
        ],
        "description": "A plain array matches any listed value. {\"all\": [\"A\", \"B\"]} matches records tagged with every listed value. Unknown values are rejected."
      },
      {
        "field": "target_company_type",
        "type": "array_string",
        "operators": [
          "overlaps",
          "contains"
        ],
        "description": "A plain array matches any listed value. {\"all\": [\"A\", \"B\"]} matches records tagged with every listed value. Unknown values are rejected."
      },
      {
        "field": "updated_at",
        "type": "datetime",
        "operators": [
          "gte"
        ],
        "description": "Change-feed checkpoint."
      },
      {
        "field": "include_deleted",
        "type": "boolean",
        "operators": [
          "eq"
        ],
        "description": "Default false. Set true on change-feed pulls."
      }
    ],
    "sort_fields": [
      "deal_date",
      "deal_valuation",
      "deal_raised",
      "updated_at"
    ],
    "sub_resources": [],
    "aggregate": {
      "metrics": [
        "ev_revenue",
        "ev_ebitda",
        "valuation",
        "raised",
        "revenue",
        "ebitda"
      ],
      "time_buckets": [
        "month",
        "quarter",
        "year",
        "none"
      ],
      "methodology": {
        "small_n_threshold": 5,
        "outlier_rule": "iqr_1.5",
        "default_date_range_years": 5,
        "empty_buckets_returned": true
      }
    }
  }
}

Besides data, the response has meta.usage, always { "records_billable": 0, "records_charged": 0 } because this call is free. See Rate Limits.

Fields - every field in the response.

Envelope

fieldtypedescription
filtersarrayThe filterable fields accepted by POST /transactions. Each item documents one field.
sort_fieldsstring[]Valid values for the sort key on POST /transactions.
sub_resourcesstring[]Related sub-collections for this resource. Empty for transactions - there are no transaction sub-resources.
aggregateobjectMethodology vocabulary for POST /transactions/aggregate.

filters[] item

fieldtypedescription
fieldstringFilter key to send on POST /transactions.
typestringValue type: one of array_uuid, array_string, number, date, datetime, boolean.
operatorsstring[]Match semantics: in, overlaps, contains, gte, lte, or eq.
valuesstring[]Allowed enum vocabulary. Present only on enum-backed fields (deal_type, deal_subtype, target_region). Send values exactly as listed.
descriptionstringUsage note. Present only on fields that need one: investor_id, valuation_min, the vocabulary fields (deal_type, deal_subtype, target_country, target_region and the five target_* tag fields), updated_at and include_deleted.

Filter field reference

fieldtypedescription
idarray_uuidMatch specific deal IDs.
target_idarray_uuidDeals where one of these companies was the target / acquired / funded company.
investor_idarray_uuidCompanies that took part in the deal in any role: lead investor, other investor or buyer.
deal_typearray_stringHigh-level deal classification. Enum-backed.
deal_subtypearray_stringGranular stage / structure. Enum-backed.
date_from / date_todateDeal-date lower / upper bound (YYYY-MM-DD).
valuation_min / valuation_maxnumberDeal post-money / enterprise valuation bound. Millions USD.
raised_min / raised_maxnumberAmount raised in the round. Millions USD.
revenue_min / revenue_maxnumberTarget revenue at the deal. Millions USD.
ebitda_min / ebitda_maxnumberTarget EBITDA at the deal. Millions USD.
ev_revenue_min / ev_revenue_maxnumberEV / Revenue multiple bound.
ev_ebitda_min / ev_ebitda_maxnumberEV / EBITDA multiple bound.
target_countryarray_stringTarget HQ country (ISO-3 codes).
target_regionarray_stringTarget macro-region. Enum-backed.
target_verticalsarray_stringTarget verticals. Plain array matches any; {"all": ["A", "B"]} matches every.
target_themesarray_stringTarget themes. Same any / all rule as target_verticals.
target_client_focusarray_stringTarget client focus (e.g. B2B, B2C). Same any / all rule.
target_revenue_modelarray_stringTarget revenue model. Same any / all rule.
target_company_typearray_stringTarget company type. Same any / all rule.
updated_atdatetimeChange-feed checkpoint: return deals updated at or after this timestamp.
include_deletedbooleanDefault false. Set true on change-feed pulls to surface soft-deleted deals.

Write-downs

Write-down (subtypes Impairment and Insolvency) is listed in the vocabulary but is a valuation event, not a transaction:

  • Impairment: a shareholder's published fair value of its stake, grossed up by the stake to a whole-company valuation. For example, Altria's $250M fair value of its 35% JUUL stake at 31 December 2022 records a valuation of about $714M.
  • Insolvency: the company is formally insolvent, bankrupt or wound down. The valuation is 0 and the company's ownership becomes Closed.

A write-down has no amount raised, revenue, EBITDA, stake or participants. POST /transactions and POST /transactions/aggregate never return or count one, so filtering on these values returns no rows. It shows up instead as the company's latest valuation when it is newer than the company's last priced deal.

aggregate

fieldtypedescription
metricsstring[]Valid metric values for POST /transactions/aggregate: ev_revenue, ev_ebitda, valuation, raised, revenue, ebitda.
time_bucketsstring[]Valid time_bucket values: month, quarter, year, or none (single overall bucket).
methodologyobjectConstants applied when computing aggregates.
methodology.small_n_thresholdintegerMinimum sample size per bucket (5). A bucket with fewer deals is returned exactly like an empty one: n: 0, median/q1/q3 null, warning null.
methodology.outlier_rulestringOutlier-trimming rule applied before computing medians (iqr_1.5 = values beyond 1.5×IQR are dropped).
methodology.default_date_range_yearsintegerDate window applied when a request omits date_from/date_to (trailing N years).
methodology.empty_buckets_returnedbooleanWhen true, time buckets with zero deals are still returned (with n: 0) so the series has no gaps.

On this page