Use case
Search people or companies withsimple_filters or filters. Discover valid fields first, inspect top values for one field, then run the paginated search.
API Reference
See the full request/response schema and parameters in the API Reference.
Pricing
See Credits & Pricing Guide for credit costs.Errors
For error responses (400, 403, 404, 409, 503, etc.), see Handling Errors.Rate limits
Filter-search-specific API rate limits.Core concepts
Recommended flow
Simple filters
simple_filters is the primary query format for this API. It supports common exact-match, range, logical, and text-search operations with concise JSON syntax.
Top-level shape
Supported operators
The capabilities response exposes supported simple-query operators insimple_query_operators.
Nested array matching ($elemMatch)
$elemMatch queries fields inside nested arrays. Two mistakes account for nearly all failed queries:
- Relative path —
company.companyIdinstead of the full dotted pathcurrentCompanies.company.companyId - Wrong type — passing a numeric ID as a string (
"1234567") when the field’svalue_typeislong
source_id. Convert it to a JSON number for the long people field currentCompanies.company.companyId.
company.companyId instead of currentCompanies.company.companyId) and the string ID ("1234567" instead of 1234567) cause this query to fail.
$elemMatch must be keyed on the field’s nested_path from capabilities — not always the outermost array. currentCompanies.company.companyId has nested_path: "currentCompanies", so $elemMatch keys on currentCompanies. currentCompanies.positions.title has nested_path: "currentCompanies.positions", so $elemMatch on currentCompanies cannot reference a positions field.
Excluding results
There are two ways to exclude records:- Use
simple_filtersoperators such as$ne,$nin,$not, and$norto exclude records that match field conditions. - Use the top-level exclusion fields —
exclude_entity_idsorexclude_list_ids— to suppress specific people or companies by ID. See Search Exclusions for identifier formats, saved lists, and limits.
page_size. Don’t rely on total_available to count excluded records or size pagination — page until next_cursor is null.
Cursor requests must send only
{"cursor": "..."}. You cannot add or change exclusions while paging through an existing cursor. Include exclusions in the first /search/query request.Query examples
Find US-based companies:$elemMatch on the inner nested path:
DSL filters
filters accepts a constrained DSL subset for cases where simple_filters is not expressive enough. For DSL syntax and clause behavior, see the OpenSearch Query DSL docs.
Top-level shape
Supported query clauses
Query examples
Exact match:must_not:
Filter capabilities
simple_filters operators and DSL limits.
Query parameters
Example request
Response shape
Limits
Field entry
Each item infields describes one queryable field.
Example response
Trimmed to two representative fields — a top-level keyword and a nested numeric.Common lookups
Filter thefields array client-side to find what is available for a given operation.
Find specific fields
To confirm that a field exists and see what operators it accepts, filter thefields array by name. The examples below check hq_country_iso2 and employees_count — the same fields used in the simple_filters examples earlier on this page.
fields, it cannot be queried. If queryable is false, the field is exposed but reserved for sort or aggregation only. If nested_path is non-null, wrap the clause in a nested query when using filters.
To search by partial name (e.g. every revenue-related field):
Field values
Scoped query
- Omit both
simple_filtersandfiltersfor global scope. - Send either
simple_filtersorfiltersfor scoped discovery. filters.sort,filters.size, and mixedfiltersplussimple_filtersrequests are not allowed on this endpoint.simple_filters.$sortandsimple_filters.$limitare not supported on this endpoint.
ownership_status, hq_country_iso2, funding_stage, and so on. Check supports_top_values: true in the capabilities response to confirm the field supports this endpoint.
Example request
Global:Nested fields
For nested fields such asfunding_rounds.name, counts are document counts and each filter_snippet is wrapped in a nested clause so it can be reused directly in DSL flows.
Search query
simple_filters, filters, parsed_query, or a search_id to re-run a previous search.
Request flow
- First request: send exactly one of
simple_filters,filters,parsed_query, orsearch_id, plus optionalpage_size,max_results, and exclusions (exclude_entity_ids,exclude_list_ids). - Next page request: send only
{"cursor":"..."}. - Requests that mix
cursorwith query or pagination fields return400.
Effective result cap
page_sizecontrols rows per page. Range1..100. Default10.max_resultscontrols the total row cap across all pages. Range1..5000.simple_filters.$limitandfilters.sizeare optional query-level caps.- When both
max_resultsand a query-level cap are set, the smaller value applies. - When no total cap is set, the backend default applies.
Example request
Fresh search:exclude_entity_ids:
exclude_public_ids for backward compatibility. For full details — company identifiers, saved lists, and limits — see Search Exclusions.
Re-run a previous search:
raw_source returns the document directly. It does not use grouped objects such as identity, profile, or location.Photo and logo URLs
People rows carry image URLs that need no credentials, so they can be embedded directly in an<img> tag, CRM record, or spreadsheet cell.
Profile photo URLs are permanent. Each returns the image (JPEG, PNG, GIF, or WebP) with
Cache-Control: public, max-age=86400, stale-while-revalidate=604800. Profile photo URLs allow 600 requests per minute per client IP. For 404, 429, 502, and 503 responses, see Handling Errors.
Older saved rows can hold a bare 32-character key in
logoUrl instead of a URL. https://api.sixtyfour.ai/v1/media/profiles/{key} serves those keys as well.