POST body:
These endpoints share the same request body shape and the same
{ data, metadata } response envelope. They differ in the fields and search modes they support, and in the resource type returned in data.
The API also exposes POST /v1/funds/search, POST /v1/limited-partners/search, and POST /v1/fundraising-processes/search with the same request body shape. This guide focuses on the core resource endpoints above.
Making a search request
Send a JSON body with your text, filters, and sort. Pass pagination as query parameters. Results come back underdata, with pagination details in metadata.
Request body
For deterministic, filter-only queries, leave
text empty and hybrid, fuzzy, and fullText set to false.
Filters
Filters are structured predicates over a resource’s indexed fields. Each clause names afield, an operator, and a value:
and / or objects inside a clause to build compound expressions.
Operators
Sort
Sorting is stable only when you pass an explicitsort. Without one, the search backend returns results in whatever order it produces, which can vary between calls to the same query.
id to break every tie, and keep the same sort on every page.
Searching activities
POST /v1/activities/search returns meetings, calls, emails, and notes filtered server-side. Prefer it over paging through the per-resource activity feeds (for example GET /v1/companies/{id}/activities) whenever the question carries a type, date window, participant, or linked resource.
activity_typeis title-cased with spaces. Common built-in values are"Meeting","Phone Call","Expert Call","Email","Note", and"Other"; connected systems may store additional labels. Comparisons are exact, so"meeting"will not match"Meeting".- IR links and person links in
activity_relatedResourcesuse<type>:<id>tokens. Supported public linkage types arefund,limited_partner,fundraising_process,deal_investor_participation, andperson. A fund link is"fund:665f1c2a9b1e4a0012a3b4c5", not a bare ObjectID. - Deal links use
activity_dealswith a bare deal ID, notactivity_relatedResources. - Date fields require a full RFC3339 timestamp such as
"2026-01-01T00:00:00Z". A bare date like"2026-01-01"fails at query time. - Word-level subject matching belongs in
textwithfullText: true. Anactivity_subjecteqfilter matches the whole subject and silently returns nothing when used as a keyword search. activity_relatedResourcesis not a sortable field.
Searching documents
Document search is the way to query the content your firm has ingested into Metal. A non-emptytext value automatically uses the hybrid query path across parsed document text.
Search vs. list
Use search
When you want relevance or a structured filter: finding records that match a concept, phrase, keyword, or field predicate.
Use list
When you want completeness: iterating over every record in order. See Pagination.
Pagination in search
Passpage and limit as query-string parameters. Search responses include a metadata object with page, limit, totalCount, and totalPages.
page defaults to 1 and limit defaults to 100. The supported maximum page size is 400 across these search endpoints. Deal and activity search clamp larger requests to 400; company, people, and document search reject requests above 400. The response’s metadata.limit reports the applied page size, so always page using the metadata values rather than the values you sent.
Deep pagination is capped: (page - 1) * limit cannot exceed 10,000. To reach records beyond that offset, narrow the filters into smaller result sets rather than paging further.
Paging through a full result set
Holdlimit, the request body, and the explicit sort constant across pages, append each response’s data, and stop once metadata.page reaches metadata.totalPages.

