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/transactionsRequest - 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/transactionsThere 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:
| element | meaning |
|---|---|
field | The 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). |
type | Value type the field expects (see types below). |
operators | How 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. |
values | Present only on enum-backed fields. The full allowed vocabulary - send values exactly as shown. |
description | Present 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
| field | type | description |
|---|---|---|
filters | array | The filterable fields accepted by POST /transactions. Each item documents one field. |
sort_fields | string[] | Valid values for the sort key on POST /transactions. |
sub_resources | string[] | Related sub-collections for this resource. Empty for transactions - there are no transaction sub-resources. |
aggregate | object | Methodology vocabulary for POST /transactions/aggregate. |
filters[] item
| field | type | description |
|---|---|---|
field | string | Filter key to send on POST /transactions. |
type | string | Value type: one of array_uuid, array_string, number, date, datetime, boolean. |
operators | string[] | Match semantics: in, overlaps, contains, gte, lte, or eq. |
values | string[] | Allowed enum vocabulary. Present only on enum-backed fields (deal_type, deal_subtype, target_region). Send values exactly as listed. |
description | string | Usage 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
| field | type | description |
|---|---|---|
id | array_uuid | Match specific deal IDs. |
target_id | array_uuid | Deals where one of these companies was the target / acquired / funded company. |
investor_id | array_uuid | Companies that took part in the deal in any role: lead investor, other investor or buyer. |
deal_type | array_string | High-level deal classification. Enum-backed. |
deal_subtype | array_string | Granular stage / structure. Enum-backed. |
date_from / date_to | date | Deal-date lower / upper bound (YYYY-MM-DD). |
valuation_min / valuation_max | number | Deal post-money / enterprise valuation bound. Millions USD. |
raised_min / raised_max | number | Amount raised in the round. Millions USD. |
revenue_min / revenue_max | number | Target revenue at the deal. Millions USD. |
ebitda_min / ebitda_max | number | Target EBITDA at the deal. Millions USD. |
ev_revenue_min / ev_revenue_max | number | EV / Revenue multiple bound. |
ev_ebitda_min / ev_ebitda_max | number | EV / EBITDA multiple bound. |
target_country | array_string | Target HQ country (ISO-3 codes). |
target_region | array_string | Target macro-region. Enum-backed. |
target_verticals | array_string | Target verticals. Plain array matches any; {"all": ["A", "B"]} matches every. |
target_themes | array_string | Target themes. Same any / all rule as target_verticals. |
target_client_focus | array_string | Target client focus (e.g. B2B, B2C). Same any / all rule. |
target_revenue_model | array_string | Target revenue model. Same any / all rule. |
target_company_type | array_string | Target company type. Same any / all rule. |
updated_at | datetime | Change-feed checkpoint: return deals updated at or after this timestamp. |
include_deleted | boolean | Default 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
ownershipbecomesClosed.
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
| field | type | description |
|---|---|---|
metrics | string[] | Valid metric values for POST /transactions/aggregate: ev_revenue, ev_ebitda, valuation, raised, revenue, ebitda. |
time_buckets | string[] | Valid time_bucket values: month, quarter, year, or none (single overall bucket). |
methodology | object | Constants applied when computing aggregates. |
methodology.small_n_threshold | integer | Minimum 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_rule | string | Outlier-trimming rule applied before computing medians (iqr_1.5 = values beyond 1.5×IQR are dropped). |
methodology.default_date_range_years | integer | Date window applied when a request omits date_from/date_to (trailing N years). |
methodology.empty_buckets_returned | boolean | When true, time buckets with zero deals are still returned (with n: 0) so the series has no gaps. |