Skip to main content
Person Semantic Search is currently in beta on POST /person/search. Request fields, ranking behavior, and query-constraint extraction may evolve based on feedback. To share input or request access, write to support@crustdata.co.
Use this when you want to search for people using natural language instead of building every filter by hand, for recruiting searches, persona discovery, market mapping, and exploratory lead lists. Person Semantic Search lets you pass a natural-language search.query to Person Search. Crustdata uses the query to rank matching people by profile context such as title, skills, company history, education, location, and summary text. You can also combine semantic ranking with structured filters.
This is current platform behavior for the live /person/search endpoint. The checked-in OpenAPI reference may not yet list the beta search object or top-level semantic mode field.

Where semantic search is available

At a glance


Structured filters are precise, but they force you to know the exact fields, operators, and indexed values before you search. That works for narrow queries, but it breaks down when your intent is broader:
  • Persona searches - “founding engineers at developer tools startups.”
  • Skill-heavy searches - “backend engineers with Golang and distributed systems experience.”
  • Job-description searches - paste the most important parts of a role and find similar profiles.
  • Exploratory recruiting - start with a plain-language role description, then tighten with filters.
Without semantic search, you need to manually translate those ideas into many field-specific filters.

The solution: natural-language ranking

Add a search object to a Person Search request:
The search.query is used to find and rank people whose profiles match the meaning of the query. You can send search by itself, or combine it with structured filters.
Do not send sorts with semantic search. Semantic results are already rank-ordered by relevance.

Limits

search.query accepts up to ~32,000 tokens (131,072 characters) — enough to paste a full job description. Requests over the limit return HTTP 400 with an error explaining the limit and the length of the query you sent.

Retrieval modes

The nested search.mode field controls which retrieval signals are used for the natural-language query. hybrid is the default. Use it unless you have a specific reason to isolate keyword-only or vector-only behavior.

Recall modes

The top-level mode field controls how Crustdata combines your natural-language query with explicit filters.
In managed mode, explicit filters are a recall and ranking signal, not always a hard global constraint. A strong profile can be returned if it matches constraints extracted from the natural-language query. Use mode: "exact" when every returned profile must satisfy your explicit filters.

Boolean keyword operators

For precise keyword search, set search.query_syntax: "boolean" to read the query as a boolean expression instead of plain text. Punctuation becomes search operators: A space means AND — every space-separated term is required. Use | for OR. This follows standard keyword-search conventions. Boolean syntax is honored only with search.mode: "lexical" and the top-level recall mode: "exact". Any other combination returns a 400. The default, query_syntax: "plain", is unchanged — existing queries keep matching as before.

Example: search from a natural-language query

This request finds people who match a plain-language recruiting query.
The response uses the normal Person Search shape, plus a per-profile fit relevance tier and a top-level total_count_relation:
Response shape
The response above shows shape only. Actual profile values depend on the query, requested fields, and account permissions.

Relevance tier (fit) and result counts

Semantic responses add two fields on top of the standard Person Search shape: Use fit to keep only high-confidence matches (for example, surface strong results and review possible ones):
fit is returned by default. If you pass an explicit fields list, add "fit" to keep it in the response. fit can be null on deeper result pages, where results are not reranked.

Example: semantic ranking inside hard filters

Use mode: "exact" when your filters must be enforced. This example limits the result set to people in San Francisco, then uses the natural-language query to rank the best machine-learning profiles inside that set.
Request
Use this pattern when you need deterministic membership for handoffs to agents, workflows, or downstream systems.

When to use each approach


What to do next