Skip to main content
Search returns the most relevant records for a query, ranked by relevance rather than recency. Use it when you want to find records by meaning, keyword, or structured filter, instead of paging through an entire collection. Each core resource exposes a search endpoint that accepts a 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 under data, 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 a field, an operator, and a value:
Nest additional and / or objects inside a clause to build compound expressions.

Operators

eq on a string field is whole-value equality, not a substring or contains match. { "field": "activity_subject", "operator": "eq", "value": "diligence" } matches only an activity whose subject is exactly diligence, and returns nothing when the word appears inside a longer subject.For “mentions this word” queries, put the word in text and set fullText: true. Use match for regular expressions. contains is not a supported operator.

Sort

Sorting is stable only when you pass an explicit sort. Without one, the search backend returns results in whatever order it produces, which can vary between calls to the same query.
When paging through a large result set, a single sort field is rarely enough — rows that tie on the primary field can shift between pages. Add a stable secondary field such as the resource’s 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.
A few activity-specific rules that trip up first calls:
  • activity_type is 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_relatedResources use <type>:<id> tokens. Supported public linkage types are fund, limited_partner, fundraising_process, deal_investor_participation, and person. A fund link is "fund:665f1c2a9b1e4a0012a3b4c5", not a bare ObjectID.
  • Deal links use activity_deals with a bare deal ID, not activity_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 text with fullText: true. An activity_subject eq filter matches the whole subject and silently returns nothing when used as a keyword search.
  • activity_relatedResources is not a sortable field.

Searching documents

Document search is the way to query the content your firm has ingested into Metal. A non-empty text 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.
Pass page 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

Hold limit, the request body, and the explicit sort constant across pages, append each response’s data, and stop once metadata.page reaches metadata.totalPages.