Skip to main content
Reference material for Person Autocomplete: contract vs current behavior, supported filter operators, request parameters, autocomplete-enabled fields, implementation tips for UI builders, and errors. For walk-through examples, see Person Autocomplete and Recipes.

Guaranteed contract vs current behavior

Use this table to separate the parts you can build against with confidence from the observed behavior that may evolve.
TopicKindWhat it means
Endpoint, HTTP method, auth headersContractPOST /person/search/autocomplete, bearer auth, x-api-version: 2025-11-01.
Request body shapeContractfield and query required, limit and filters optional, filters uses conditions / condition groups with the documented operators.
Response body shapeContract{ "suggestions": [ { "value" } ] }. Empty results return {"suggestions": []} with status 200.
Supported operatorsContract=, !=, <, =<, >, =>, in, not_in, contains — see Supported operators.
limit bounds and defaultContractMinimum 1, maximum 100, default 20.
Error status codesContract400 (invalid request), 401 (unauthorized), 500 (internal).
Suggestion rankingCurrent behaviorSuggestions are ranked by internal frequency within the (optionally filtered) population — the ranking signal is not exposed in the response.
Case-insensitive query matchingCurrent behavior"vp" and "VP" currently return the same suggestions.
Multi-token query loose matchingCurrent behaviorA multi-word query may return values containing only one of the tokens.
Blank-string suggestionsCurrent behaviorEmpty-query calls can return "" as the top suggestion when a field has many empty indexed records.

Supported operators

The type field on every AutocompleteFilterCondition accepts the same operators as Person Search filters.
The greater-than-or-equal operator is => (not >=) and less-than-or-equal is =< (not <=). This is intentional — do not mistype them as the more common <= and >=.
Operatorvalue shapeMeaning
=string, number, integer, or booleanExact match — the field value equals value.
!=string, number, integer, or booleanNot equal — the field value differs from value.
<number or ISO date stringLess than — numeric or date comparison.
=<number or ISO date stringLess than or equal — numeric or date comparison.
>number or ISO date stringGreater than — numeric or date comparison.
=>number or ISO date stringGreater than or equal — numeric or date comparison.
inarray of strings, numbers, or integersMembership — field value matches any entry in the array.
not_inarray of strings, numbers, or integersNegated membership — field value matches none of the entries in the array.
containsstringSubstring match — field value contains value.
Pass values with the JSON type that matches the underlying field: "value": 10000 for numeric fields, "value": true for booleans, and strings for text fields. in and not_in require a JSON array — a comma-separated string will return a 400.

Request parameters

Operator footguns. Use => for greater-than-or-equal and =< for less-than-or-equal — these are not >= and <=. in / not_in require JSON arrays (not comma-separated strings).
ParameterTypeRequiredDescription
fieldstringYesDataset field whose values you want suggested. Must be an autocomplete-enabled field — see Autocomplete-enabled fields. Unsupported fields return 400.
querystringYesPartial text to match against indexed values. Pass "" to retrieve the top values for the field by frequency.
limitintegerNoMaximum number of suggestions to return. Minimum 1, maximum 100, default 20.
filtersobjectNoOptional scope for the autocomplete computation. Pass either a single AutocompleteFilterCondition or a nested AutocompleteFilterConditionGroup.

AutocompleteFilterCondition

FieldTypeRequiredDescription
fieldstringYesDataset field to filter on. Can be any Person Search filter field — this scope is broader than the autocomplete allowlist for the top-level field.
typestring (enum)YesOne of the supported operators: =, !=, <, =<, >, =>, in, not_in, contains.
valuestring, number, integer, boolean, or arrayYesScalar for comparison operators; JSON array of strings/numbers/integers for in and not_in. Match the JSON type to the underlying field’s type.

AutocompleteFilterConditionGroup

FieldTypeRequiredDescription
opstring (enum)Yes"and" or "or".
conditionsarrayYesOne or more AutocompleteFilterCondition items or nested AutocompleteFilterConditionGroup items. Must contain at least one.

Autocomplete-enabled fields

The top-level field in a Person Autocomplete request (the field whose values you want suggested) must come from a fixed allowlist of autocomplete-enabled dataset fields. Not every Person Search field is autocomplete-enabled. The filters.field is different: it can be any dataset field that Person Search accepts as a filter, not only the autocomplete allowlist. So you can filter autocomplete results on a broader set of fields than you can autocomplete on directly.
The tables below are a documented subset of the autocomplete allowlist. They cover the fields most useful for building filter dropdowns, but they are not exhaustive. If a field you need is not listed, treat its support as unknown until you verify it — the safest way to confirm is to call the endpoint with that field and check whether you get a 400 error. See Verify the live list below for the debug-only live source.
company_name vs name for employers (current behavior). Both experience.employment_details.current.company_name and experience.employment_details.current.name are currently accepted and return the current employer. Prefer company_name for clarity; name is an alternative spelling retained for backwards compatibility and may eventually be removed.

Common supported fields

FieldWhat it discovers
experience.employment_details.current.titleCurrent job titles
experience.employment_details.current.nameCurrent employer names
experience.employment_details.current.seniority_levelSeniority level buckets
experience.employment_details.current.function_categoryJob function
experience.employment_details.current.company_industriesCurrent employer industries
experience.employment_details.current.company_typeCurrent employer type
experience.employment_details.current.company_hq_locationCurrent employer HQ location
experience.employment_details.current.company_website_domainCurrent employer website domain

Verify the live list

Debug fallback only — do not parse this error message in production code. The 400 error message is a human-readable debugging aid, not a stable API surface. Its shape, ordering, and field list can change without notice. Use it during development to confirm whether a specific field is autocomplete-enabled, then maintain your own allowlist or rely on the common-fields tables above.
Call the endpoint with a deliberately invalid field. The 400 response lists every currently accepted field in its error message:
curl --request POST \
  --url https://api.crustdata.com/person/search/autocomplete \
  --header 'authorization: Bearer YOUR_API_KEY' \
  --header 'content-type: application/json' \
  --header 'x-api-version: 2025-11-01' \
  --data '{
    "field": "current_title",
    "query": "",
    "limit": 1
  }'

Implementation tips for UI builders

  • Debounce autocomplete calls to avoid one request per keystroke — 150–300 ms on input idle works well for typeahead UIs.
  • Drop blank values. If "" is returned as the top suggestion, remove it before rendering the dropdown.
  • Handle casing variants carefully. Suggestions like "VP" and "vp" are distinct indexed values. Only merge them into a single UI option if you intentionally want normalized grouping — and if you do, preserve the underlying raw values and expand them in the eventual Person Search filter using in, for example {"type": "in", "value": ["VP", "vp"]}. If the UI needs exact-value selection, keep them as separate options.
  • Cap limit. Most dropdowns need 5–15 options. Lower limit reduces payload size and gives faster responses.
  • Cache top-values lookups. Empty-query calls that seed filter dropdowns rarely change — cache them client-side or at the edge.

Errors

StatusMeaning
400Invalid request — unsupported field, missing required field, a wrong value shape (for example a comma string for in), or a malformed body.
401Unauthorized — the Authorization header is missing, malformed, or contains an invalid API key.
500Internal server error — retry after a short delay.
Note: a query that matches nothing is not an error — the endpoint returns {"suggestions": []} with a 200 status. Only use 4xx/5xx handling for actual request or server failures.
{
    "error": {
        "type": "invalid_request",
        "message": "Field 'current_title' is not valid for autocomplete. Available fields are: basic_profile.headline, ..., experience.employment_details.current.function_category, experience.employment_details.current.title, ..., skills.professional_network_skills, social_handles.twitter_identifier.slug",
        "metadata": []
    }
}

API reference summary

DetailValue
EndpointPOST /person/search/autocomplete
AuthBearer token + x-api-version: 2025-11-01
Required paramsfield, query
Optional paramslimit (default: 20, max: 100), filters
Response{ "suggestions": [{ "value": "..." }] }
Empty result200 with "suggestions": []
Errors400 (unsupported field or bad value), 401 (bad auth), 500 (server error)
See the full API reference for the complete OpenAPI schema.