---
title: "Run a people search"
method: POST
path: "/business/prospects/search"
tags: ["Prospect search"]
---

# Run a people search

`POST /business/prospects/search`

## Request

- Base URL: `https://api.tryfuse.ai/api/v1`
- URL: `https://api.tryfuse.ai/api/v1/business/prospects/search`
- Auth: HTTP basic

Run a people search. The filter source is exactly one of: literal `filters`, a stored PEOPLE saved search (`savedSearchId` or `savedSearchName`), or a natural-language `query` (the product's smart search converts the prose into filters; criteria it could not map come back as `unresolvedCriteria`). Sending two sources is a 422. A saved search resolves to its filters and echoes `ignoredFilterKeys` for stored keys with no search field; a company saved search answers 422 SAVED_SEARCH_TYPE_MISMATCH.

The response always echoes the RESOLVED `filters` — reuse them verbatim to page, refine, or POST /prospects/search/save-to-list — plus the true match `total` and a `scrollToken` for the next page (send it back with the same filter source; it is null when there is no continuation).

Rows are the provider's person record in snake_case, so the fields present vary by person, plus Fuse's own keys: `pdlId` (the provider's person id; absent on the rare row the profile cache could not store), `_id` (our stable id for the cached person record, present unless that row could not be cached), `savedProfile` / `savedBy` (whether this person is already a contact of yours), and `linkedinConnectedAccountIds` / `linkedinInvitationSentAccountIds` (which of your connected LinkedIn accounts already reached them). Rows carry no email address or phone number — searching is discovery only. Contact details you have already enriched for some of these people are stripped too, so a row never depends on your enrichment history; use /prospects/search/save-to-list with `enrich` to obtain contact details.

Billing: 2 credits per requested profile are pre-checked and 2 credits per profile returned are debited. (Enforced by the public row transformer, which removes Fuse's enrichment overlay and the provider's own work_email, personal_emails, recommended_personal_email, mobile_phone and phone_numbers before the row is returned.)

Errors:
- `402` `INSUFFICIENT_CREDITS` — The balance does not cover the pre-check for this request; nothing was billed.
- `404` `SAVED_SEARCH_NOT_FOUND` — No saved search of yours has that id or exact title.
- `409` `SAVED_SEARCH_NAME_AMBIGUOUS` — Two of your saved searches share that title — reference it by `savedSearchId` instead.
- `422` `VALIDATION_FAILED` — The request failed the declared schema; `param` names the offending key and `message` quotes the rule it broke.
- `422` `SAVED_SEARCH_TYPE_MISMATCH` — The saved search exists but stores the other kind of filters; `param` is `savedSearchId`.
- `422` `SAVED_SEARCH_INVALID` — The STORED filters no longer form a runnable search — every value was retired, or the blob translates to nothing.
- `422` `QUERY_FILTERS_INVALID` — The natural-language `query` produced no usable filter; name concrete criteria.
- `422` `SEARCH_FILTERS_INVALID` — The provider rejected the assembled query as malformed — a filter value is the wrong shape for its field.
- `429` `RATE_LIMITED` — Per-token rate limit for this bucket exhausted; retry after the window in the RateLimit-Reset header.
- `500` `UNEXPECTED_ERROR` — The request failed inside the service; nothing was billed and the request_id identifies the failure.

Requires one of the following token scopes: search.

## Request body

- object: Exactly one filter source — `filters`, `savedSearchId`, `savedSearchName` or `query` — plus optional paging. With `filters`, at least one non-empty filter value, a `linkedinUrl` or a `scrollToken` is required, and enum-backed values must come from GET /prospects/filter-options (422 otherwise, before anything is billed).
  - `filters` object: Literal filters, one of the four filter sources. People filters in the search vocabulary: include/exclude fields take `[{ status, value }]` entries, term fields a string or an array of strings, `rangeInputs` `{ min, max }` ranges — every field and its accepted values are listed by GET /prospects/filter-options. On this endpoint a value outside a field's listed vocabulary is refused with 422 VALIDATION_FAILED, naming the field and the value, before anything is billed.
    - `industry` object[]: Industry of the person themselves; include/exclude entries whose `value` is one of the 147 `industry` values from GET /prospects/filter-options (e.g. financial services). Include values are OR-joined and every exclude applies; at most 1000 entries.
      - `status` 'include' | 'exclude', required: `include` matches the value; `exclude` removes profiles carrying it (includes OR together, every exclude applies).
      - `value` string, required: The filter value (max 500 chars); for enum-backed fields use a value GET /prospects/filter-options lists for the field — other values match nothing.
      - `label` string: Optional display label as returned by GET /prospects/filter-options; accepted and ignored.
    - `job_title_levels` object[]: Seniority of the current job title; entries with `value` one of exactly: cxo, vp, director, manager, senior, entry, owner, partner, training, unpaid (the `job_title_levels` list in GET /prospects/filter-options). Include values are OR-joined and every exclude applies; at most 1000 entries.
      - `status` 'include' | 'exclude', required: `include` matches the value; `exclude` removes profiles carrying it (includes OR together, every exclude applies).
      - `value` string, required: The filter value (max 500 chars); for enum-backed fields use a value GET /prospects/filter-options lists for the field — other values match nothing.
      - `label` string: Optional display label as returned by GET /prospects/filter-options; accepted and ignored.
    - `job_title_role` object[]: Department of the current job title; entries with `value` one of the 24 `job_title_role` values in GET /prospects/filter-options (e.g. engineering, sales, finance) — `jobTitleRoleToSubRole` in the same response lists each role's sub-roles. Include values are OR-joined and every exclude applies; at most 1000 entries.
      - `status` 'include' | 'exclude', required: `include` matches the value; `exclude` removes profiles carrying it (includes OR together, every exclude applies).
      - `value` string, required: The filter value (max 500 chars); for enum-backed fields use a value GET /prospects/filter-options lists for the field — other values match nothing.
      - `label` string: Optional display label as returned by GET /prospects/filter-options; accepted and ignored.
    - `job_title_sub_role` object[]: Sub-department of the current job title; entries with `value` one of the 106 `job_title_sub_role` values in GET /prospects/filter-options (e.g. software, account_executive, data_science). Include values are OR-joined and every exclude applies; at most 1000 entries.
      - `status` 'include' | 'exclude', required: `include` matches the value; `exclude` removes profiles carrying it (includes OR together, every exclude applies).
      - `value` string, required: The filter value (max 500 chars); for enum-backed fields use a value GET /prospects/filter-options lists for the field — other values match nothing.
      - `label` string: Optional display label as returned by GET /prospects/filter-options; accepted and ignored.
    - `job_company_size` object[]: Headcount bracket of the current employer; entries with `value` one of exactly: 1-10, 11-50, 51-200, 201-500, 501-1000, 1001-5000, 5001-10000, 10001+ — brackets only, so use `rangeInputs.job_company_employee_count` for an arbitrary headcount range. Include values are OR-joined and every exclude applies; at most 1000 entries.
      - `status` 'include' | 'exclude', required: `include` matches the value; `exclude` removes profiles carrying it (includes OR together, every exclude applies).
      - `value` string, required: The filter value (max 500 chars); for enum-backed fields use a value GET /prospects/filter-options lists for the field — other values match nothing.
      - `label` string: Optional display label as returned by GET /prospects/filter-options; accepted and ignored.
    - `job_company_inferred_revenue` object[]: Inferred annual revenue bracket of the current employer; entries with `value` one of exactly: $0-$1m, $1m-$10m, $10m-$25m, $25m-$50m, $50m-$100m, $100m-$250m, $250m-$500m, $500m-$1b, $1b-$10b, $10b+ (matched case-insensitively, so $1M-$10M also works). Include values are OR-joined and every exclude applies; at most 1000 entries.
      - `status` 'include' | 'exclude', required: `include` matches the value; `exclude` removes profiles carrying it (includes OR together, every exclude applies).
      - `value` string, required: The filter value (max 500 chars); for enum-backed fields use a value GET /prospects/filter-options lists for the field — other values match nothing.
      - `label` string: Optional display label as returned by GET /prospects/filter-options; accepted and ignored.
    - `job_company_industry` object[]: Industry of the current employer; entries with `value` one of the same 147 industry values, listed under `job_company_industry` in GET /prospects/filter-options. Include values are OR-joined and every exclude applies; at most 1000 entries.
      - `status` 'include' | 'exclude', required: `include` matches the value; `exclude` removes profiles carrying it (includes OR together, every exclude applies).
      - `value` string, required: The filter value (max 500 chars); for enum-backed fields use a value GET /prospects/filter-options lists for the field — other values match nothing.
      - `label` string: Optional display label as returned by GET /prospects/filter-options; accepted and ignored.
    - `job_company_location_country` object[]: Country of the current employer's headquarters; entries with a lower-case `value` from the 249 `job_company_location_country` values in GET /prospects/filter-options (e.g. united states, germany) — country NAMES, never ISO codes. Include values are OR-joined and every exclude applies; at most 1000 entries.
      - `status` 'include' | 'exclude', required: `include` matches the value; `exclude` removes profiles carrying it (includes OR together, every exclude applies).
      - `value` string, required: The filter value (max 500 chars); for enum-backed fields use a value GET /prospects/filter-options lists for the field — other values match nothing.
      - `label` string: Optional display label as returned by GET /prospects/filter-options; accepted and ignored.
    - `job_company_location_region` object[]: Region or state of the current employer's headquarters; entries with a free-text lower-case `value` such as california — resolve names with GET /prospects/autocomplete?field=region.
      - `status` 'include' | 'exclude', required: `include` matches the value; `exclude` removes profiles carrying it (includes OR together, every exclude applies).
      - `value` string, required: The filter value (max 500 chars); for enum-backed fields use a value GET /prospects/filter-options lists for the field — other values match nothing.
      - `label` string: Optional display label as returned by GET /prospects/filter-options; accepted and ignored.
    - `job_company_location_continent` object[]: Continent of the current employer's headquarters; entries with `value` one of exactly: africa, antarctica, asia, europe, north america, oceania, south america. Include values are OR-joined and every exclude applies; at most 1000 entries.
      - `status` 'include' | 'exclude', required: `include` matches the value; `exclude` removes profiles carrying it (includes OR together, every exclude applies).
      - `value` string, required: The filter value (max 500 chars); for enum-backed fields use a value GET /prospects/filter-options lists for the field — other values match nothing.
      - `label` string: Optional display label as returned by GET /prospects/filter-options; accepted and ignored.
    - `experience.company.location.continent` object[]: Continent of the headquarters of any PAST employer; entries with `value` one of exactly: africa, antarctica, asia, europe, north america, oceania, south america. Include values are OR-joined and every exclude applies; at most 1000 entries.
      - `status` 'include' | 'exclude', required: `include` matches the value; `exclude` removes profiles carrying it (includes OR together, every exclude applies).
      - `value` string, required: The filter value (max 500 chars); for enum-backed fields use a value GET /prospects/filter-options lists for the field — other values match nothing.
      - `label` string: Optional display label as returned by GET /prospects/filter-options; accepted and ignored.
    - `experience.title.levels` object[]: Seniority of any past job title; entries with `value` one of exactly: cxo, vp, director, manager, senior, entry, owner, partner, training, unpaid. Include values are OR-joined and every exclude applies; at most 1000 entries.
      - `status` 'include' | 'exclude', required: `include` matches the value; `exclude` removes profiles carrying it (includes OR together, every exclude applies).
      - `value` string, required: The filter value (max 500 chars); for enum-backed fields use a value GET /prospects/filter-options lists for the field — other values match nothing.
      - `label` string: Optional display label as returned by GET /prospects/filter-options; accepted and ignored.
    - `experience.title.role` object[]: Department of any past job title; entries with `value` one of the 24 `experience.title.role` values in GET /prospects/filter-options — the same list as `job_title_role`. Include values are OR-joined and every exclude applies; at most 1000 entries.
      - `status` 'include' | 'exclude', required: `include` matches the value; `exclude` removes profiles carrying it (includes OR together, every exclude applies).
      - `value` string, required: The filter value (max 500 chars); for enum-backed fields use a value GET /prospects/filter-options lists for the field — other values match nothing.
      - `label` string: Optional display label as returned by GET /prospects/filter-options; accepted and ignored.
    - `experience.title.sub_role` object[]: Sub-department of any past job title; entries with `value` one of the 106 `experience.title.sub_role` values in GET /prospects/filter-options — the same list as `job_title_sub_role`. Include values are OR-joined and every exclude applies; at most 1000 entries.
      - `status` 'include' | 'exclude', required: `include` matches the value; `exclude` removes profiles carrying it (includes OR together, every exclude applies).
      - `value` string, required: The filter value (max 500 chars); for enum-backed fields use a value GET /prospects/filter-options lists for the field — other values match nothing.
      - `label` string: Optional display label as returned by GET /prospects/filter-options; accepted and ignored.
    - `experience.company.location.country` object[]: Country of the headquarters of any past employer; entries with a lower-case `value` from the 249 `experience.company.location.country` values in GET /prospects/filter-options (e.g. united states) — country NAMES, never ISO codes. Include values are OR-joined and every exclude applies; at most 1000 entries.
      - `status` 'include' | 'exclude', required: `include` matches the value; `exclude` removes profiles carrying it (includes OR together, every exclude applies).
      - `value` string, required: The filter value (max 500 chars); for enum-backed fields use a value GET /prospects/filter-options lists for the field — other values match nothing.
      - `label` string: Optional display label as returned by GET /prospects/filter-options; accepted and ignored.
    - `experience.company.industry` object[]: Industry of any past employer; entries with `value` one of the same 147 industry values, listed under `experience.company.industry` in GET /prospects/filter-options. Include values are OR-joined and every exclude applies; at most 1000 entries.
      - `status` 'include' | 'exclude', required: `include` matches the value; `exclude` removes profiles carrying it (includes OR together, every exclude applies).
      - `value` string, required: The filter value (max 500 chars); for enum-backed fields use a value GET /prospects/filter-options lists for the field — other values match nothing.
      - `label` string: Optional display label as returned by GET /prospects/filter-options; accepted and ignored.
    - `languages.name` object[]: Languages the person lists; entries with a lower-case `value` from the 526 `languages.name` values in GET /prospects/filter-options (e.g. english, german) — language NAMES, never ISO codes. Include values are OR-joined and every exclude applies; at most 1000 entries.
      - `status` 'include' | 'exclude', required: `include` matches the value; `exclude` removes profiles carrying it (includes OR together, every exclude applies).
      - `value` string, required: The filter value (max 500 chars); for enum-backed fields use a value GET /prospects/filter-options lists for the field — other values match nothing.
      - `label` string: Optional display label as returned by GET /prospects/filter-options; accepted and ignored.
    - `location_continent` object[]: Continent the person lives in; entries with `value` one of exactly: africa, antarctica, asia, europe, north america, oceania, south america. Include values are OR-joined and every exclude applies; at most 1000 entries.
      - `status` 'include' | 'exclude', required: `include` matches the value; `exclude` removes profiles carrying it (includes OR together, every exclude applies).
      - `value` string, required: The filter value (max 500 chars); for enum-backed fields use a value GET /prospects/filter-options lists for the field — other values match nothing.
      - `label` string: Optional display label as returned by GET /prospects/filter-options; accepted and ignored.
    - `location_country` object[]: Country the person lives in; entries with a lower-case `value` from the 249 `location_country` values in GET /prospects/filter-options (e.g. united states, united kingdom) — country NAMES, never ISO codes. Include values are OR-joined and every exclude applies; at most 1000 entries.
      - `status` 'include' | 'exclude', required: `include` matches the value; `exclude` removes profiles carrying it (includes OR together, every exclude applies).
      - `value` string, required: The filter value (max 500 chars); for enum-backed fields use a value GET /prospects/filter-options lists for the field — other values match nothing.
      - `label` string: Optional display label as returned by GET /prospects/filter-options; accepted and ignored.
    - `location_region` object[]: Region or state the person lives in; entries with a free-text lower-case `value` such as california — resolve names with GET /prospects/autocomplete?field=region.
      - `status` 'include' | 'exclude', required: `include` matches the value; `exclude` removes profiles carrying it (includes OR together, every exclude applies).
      - `value` string, required: The filter value (max 500 chars); for enum-backed fields use a value GET /prospects/filter-options lists for the field — other values match nothing.
      - `label` string: Optional display label as returned by GET /prospects/filter-options; accepted and ignored.
    - `education.degrees` object[]: Degrees held; entries with `value` one of the 171 `education.degrees` values in GET /prospects/filter-options (e.g. bachelors, masters, master of business administration). Include values are OR-joined and every exclude applies; at most 1000 entries.
      - `status` 'include' | 'exclude', required: `include` matches the value; `exclude` removes profiles carrying it (includes OR together, every exclude applies).
      - `value` string, required: The filter value (max 500 chars); for enum-backed fields use a value GET /prospects/filter-options lists for the field — other values match nothing.
      - `label` string: Optional display label as returned by GET /prospects/filter-options; accepted and ignored.
    - `experience.company.type` object[]: Type of any past employer; entries with `value` one of exactly: educational, government, nonprofit, private, public, public_subsidiary. Include values are OR-joined and every exclude applies; at most 1000 entries.
      - `status` 'include' | 'exclude', required: `include` matches the value; `exclude` removes profiles carrying it (includes OR together, every exclude applies).
      - `value` string, required: The filter value (max 500 chars); for enum-backed fields use a value GET /prospects/filter-options lists for the field — other values match nothing.
      - `label` string: Optional display label as returned by GET /prospects/filter-options; accepted and ignored.
    - `job_company_name` union: Name of the current employer, lower-case (e.g. stripe); include/exclude entries, a bare string, or an array of strings (bare strings are includes) — resolve names with GET /prospects/autocomplete?field=company.
      - string
      - union[]
        - union
          - string
          - object
            - `status` 'include' | 'exclude', required: `include` matches the value; `exclude` removes profiles carrying it (includes OR together, every exclude applies).
            - `value` string, required: The filter value (max 500 chars); for enum-backed fields use a value GET /prospects/filter-options lists for the field — other values match nothing.
            - `label` string: Optional display label as returned by GET /prospects/filter-options; accepted and ignored.
    - `job_company_website` union: Website domain of the current employer (e.g. stripe.com — scheme, www and trailing slash are stripped); same value shapes as `job_company_name`; resolve with GET /prospects/autocomplete?field=website.
      - string
      - union[]
        - union
          - string
          - object
            - `status` 'include' | 'exclude', required: `include` matches the value; `exclude` removes profiles carrying it (includes OR together, every exclude applies).
            - `value` string, required: The filter value (max 500 chars); for enum-backed fields use a value GET /prospects/filter-options lists for the field — other values match nothing.
            - `label` string: Optional display label as returned by GET /prospects/filter-options; accepted and ignored.
    - `linkedin_url` union: Matched as an EXACT term in the stored form linkedin.com/in/<slug> — no scheme, no www., no trailing slash; anything else is accepted and silently matches nothing. Prefer the top-level `linkedinUrl`, which IS normalised before matching. A string, an array of URLs that are OR-joined, or include/exclude entries ({ status, value }); every exclude applies, at most 1000 entries.
      - string
      - union[]
        - union
          - string
          - object
            - `status` 'include' | 'exclude', required: `include` matches the value; `exclude` removes profiles carrying it (includes OR together, every exclude applies).
            - `value` string, required: The filter value (max 500 chars); for enum-backed fields use a value GET /prospects/filter-options lists for the field — other values match nothing.
            - `label` string: Optional display label as returned by GET /prospects/filter-options; accepted and ignored.
    - `full_name` union: Free text, but matched as an EXACT lower-case term against the stored full name (e.g. ada nwosu): there is no partial matching, so a differently cased or partial name is accepted and silently matches nothing. A string, or an array of names that are OR-joined (the provider caps a terms list at 1000).
      - string
      - number
      - boolean
      - string[]
    - `first_name` union: Free text, matched as an EXACT lower-case term: a different case or a nickname is accepted and silently matches nothing. A string, or an array of names that are OR-joined. Cannot be stored in a saved search (422 SAVED_SEARCH_FILTERS_UNSUPPORTED).
      - string
      - number
      - boolean
      - string[]
    - `last_name` union: Free text, matched as an EXACT lower-case term: a different case or spelling is accepted and silently matches nothing. A string, or an array of names that are OR-joined. Cannot be stored in a saved search (422 SAVED_SEARCH_FILTERS_UNSUPPORTED).
      - string
      - number
      - boolean
      - string[]
    - `sex` union: One of exactly: female, male. A string, or an array of both (OR-joined).
      - string
      - number
      - boolean
      - string[]
    - `work_email` union: Free text, matched as an EXACT lower-case term against the stored work email: a different case or an alias is accepted and silently matches nothing. A string, or an array of addresses that are OR-joined.
      - string
      - number
      - boolean
      - string[]
    - `mobile_phone` union: Free text, matched as an EXACT term, so send E.164 with the leading + (e.g. +14155552671); any other formatting is accepted and silently matches nothing. A string, or an array of numbers that are OR-joined.
      - string
      - number
      - boolean
      - string[]
    - `personal_emails` union: Free text, matched as an EXACT lower-case term against every personal email on the profile: any other spelling is accepted and silently matches nothing. A string, or an array of addresses that are OR-joined.
      - string
      - number
      - boolean
      - string[]
    - `job_title` union: Exact lower-case current job title (e.g. chief financial officer); a string or an array of titles — use `keywords` for partial matches and GET /prospects/autocomplete?field=title for suggestions.
      - string
      - number
      - boolean
      - string[]
    - `job_company_location_name` union: Locality of the current employer's headquarters as a PDL location name (e.g. san francisco, california, united states); resolve with GET /prospects/autocomplete?field=location.
      - string
      - number
      - boolean
      - string[]
    - `location_name` union: Where the person lives, as a PDL location name (e.g. london, greater london, united kingdom); resolve with GET /prospects/autocomplete?field=location.
      - string
      - number
      - boolean
      - string[]
    - `github_url` union: Free text, matched as an EXACT term in the stored form github.com/<username> — no scheme, no trailing slash; anything else is accepted and silently matches nothing. A string, or an array of URLs that are OR-joined.
      - string
      - number
      - boolean
      - string[]
    - `github_username` union: Free text, matched as an EXACT lower-case term against the stored GitHub username: a different case is accepted and silently matches nothing. A string, or an array of usernames that are OR-joined.
      - string
      - number
      - boolean
      - string[]
    - `facebook_url` union: Free text, matched as an EXACT term in the stored form facebook.com/<slug> — no scheme, no trailing slash; anything else is accepted and silently matches nothing. A string, or an array of URLs that are OR-joined.
      - string
      - number
      - boolean
      - string[]
    - `education.school.name` union: Lower-case name of a school attended (e.g. stanford university); resolve with GET /prospects/autocomplete?field=school.
      - string
      - number
      - boolean
      - string[]
    - `experience.title.name` union: Exact lower-case title held at any past job; a string or an array of titles.
      - string
      - number
      - boolean
      - string[]
    - `experience.company.name` union: Lower-case name of any past employer; a string or an array — resolve with GET /prospects/autocomplete?field=company.
      - string
      - number
      - boolean
      - string[]
    - `experience.company.website` union: Free text: the website host of any past employer (e.g. stripe.com). The scheme, www. and a trailing slash are stripped and both the host+path and host-only forms are tried, so a full URL still matches; a host the provider does not store matches nothing. A string, or an array of hosts that are OR-joined.
      - string
      - number
      - boolean
      - string[]
    - `job_start_date` union: Free text, matched as an EXACT term and NOT as a range: the stored start date of the current job, YYYY-MM or YYYY-MM-DD exactly as stored (most profiles store YYYY-MM), so 2023-05-01 does not match a profile stored as 2023-05. A string, or an array of dates that are OR-joined.
      - string
      - number
      - boolean
      - string[]
    - `skills` union: Lower-case skill (e.g. python); a string, or an array of skills any of which may match — resolve with GET /prospects/autocomplete?field=skill.
      - string
      - number
      - boolean
      - string[]
    - `certifications.name` union: Lower-case certification name (e.g. pmp); a string or an array.
      - string
      - number
      - boolean
      - string[]
    - `experience.company.location.name` union: Locality of any past employer's headquarters as a PDL location name.
      - string
      - number
      - boolean
      - string[]
    - `keywords` string[]: Free text: up to 50 terms (200 chars each), each matched against the current job title only and OR-joined, so any one may match. A bare term matches anywhere in the title (growth matches Head of Growth); a term carrying your own * or ? must match the WHOLE title (manager* starts with, *manager ends with, ? is exactly one character). Matching is case-insensitive. A term with no text other than wildcards is ignored, since it would match every title, and a list holding only such terms does not count as search criteria. This is the costliest filter the provider serves, so keep the list short.
    - `excludedKeywords` string[]: Free text: up to 50 terms (200 chars each) using exactly the same matching rules as `keywords`, but REMOVING every prospect whose current job title matches any one of them — keywords [engineer] with excludedKeywords [infrastructure] keeps Engineer VP and drops Engineer VP Infrastructure. It reads the whole job title, so it also removes rows matched by `job_title`. A term with no text other than wildcards is ignored, since it would remove every prospect that has a job title. Exclusions only narrow a result set: on their own they are not search criteria and a request carrying nothing else is rejected.
    - `rangeInputs` object: Numeric range filters, each key one of exactly: `job_company_employee_count`, `inferred_years_experience`, `job_company_total_funding_raised` (any other key is rejected). Each value is `{ min?, max? }` with at least one bound and min <= max; several ranges AND with each other and with every other filter.
      - `job_company_employee_count` object: Headcount of the current employer; accepted values are whole numbers and both bounds are inclusive. A min of 0 is ignored rather than applied, so cap headcount with max alone.
        - `min` number: Inclusive lower bound (0 is treated as no bound).
        - `max` number: Inclusive upper bound.
      - `inferred_years_experience` object: Total years of professional experience; accepted values are whole numbers of years and both bounds are inclusive. A min of 0 is ignored rather than applied.
        - `min` number: Inclusive lower bound (0 is treated as no bound).
        - `max` number: Inclusive upper bound.
      - `job_company_total_funding_raised` object: Total funding raised by the current employer; accepted values are whole US dollars, not millions (10000000 means $10M), and both bounds are inclusive. A min of 0 is ignored rather than applied.
        - `min` number: Inclusive lower bound (0 is treated as no bound).
        - `max` number: Inclusive upper bound.
  - `savedSearchId` string: Id of one of your PEOPLE saved searches to take the filters from instead of `filters` (a company saved search answers 422 SAVED_SEARCH_TYPE_MISMATCH).
  - `savedSearchName` string: Exact title of one of your people saved searches to take the filters from instead of `filters`; two searches sharing the title answer 409 SAVED_SEARCH_NAME_AMBIGUOUS.
  - `query` string: Natural-language description of who to find (max 2000 chars), converted into filters server-side instead of `filters`; criteria that could not be mapped come back as `unresolvedCriteria`, and a query yielding no filter answers 422 QUERY_FILTERS_INVALID.
  - `size` integer: Profiles per page (1-100, default 10); the search pre-checks 2 credits per requested profile and debits 2 credits per profile returned.
  - `scrollToken` string: The `scrollToken` returned by the previous page, sent together with the same filter source, to fetch the next page.
  - `linkedinUrl` string: A LinkedIn profile URL to look up one person (normalised before matching); counts as search criteria on its own.

## Response `200`

Success

- object
  - `profiles` object[], required
    - `_id` string: Fuse's own id for the cached person record; stable across searches and the id `savedProfile` refers to. Absent on a row the cache could not store.
    - `pdlId` string: The provider's person id; always present — on a row the cache could not store it is the only id the row carries.
    - `savedProfile` boolean: Whether this person is already a contact in one of your lists. Absent on a row the cache could not store, which cannot be matched against your contacts.
    - `savedBy` string, nullable: Id of the workspace member who saved the contact; null when it is not saved, absent on a row the cache could not store.
    - `linkedinConnectedAccountIds` string[], required: Ids of your connected LinkedIn accounts already connected to this person.
    - `linkedinInvitationSentAccountIds` string[], required: Ids of your connected LinkedIn accounts that have already sent this person an invitation.
    - `linkedin_url` string
    - `full_name` string
    - `sex` string
    - `industry` string
    - `job_title` string
    - `job_title_role` string
    - `job_title_sub_role` string
    - `job_title_class` string
    - `job_title_levels` string[]
    - `job_company_name` string
    - `job_company_website` string
    - `location_name` string
    - `profile_score` string: Provider signal string (e.g. "positive signals"); provider-driven, so not on every row.
    - `activity_score` string: Provider signal string (e.g. "positive signals"); provider-driven, so not on every row.
    - `dataset_version` string
    - `pdl_version` string, nullable
    - `job_change_detected_at` string, date-time, nullable
    - `createdAt` string, date-time
    - `updatedAt` string, date-time
  - `scrollToken` string, nullable, required: Send back as `scrollToken` with the same filter source to fetch the next page; null when the provider returned no continuation.
  - `total` integer, required: Total number of people matching the filters, not the page size.
  - `filters` object, required: The RESOLVED filters the search actually ran, in the POST /prospects/search vocabulary.
  - `ignoredFilterKeys` string[]: Only when the source was a saved search: stored keys with no equivalent search field, which were dropped.
  - `unresolvedCriteria` string[]: Only when the source was `query`: criteria in the prose that could not be turned into a filter.

## Other responses

- `400`: Error
- `401`: Error
- `402`: Error
- `403`: Error
- `404`: Error
- `409`: Error
- `422`: Error
- `429`: Error
- `500`: Error

---

[API](https://skmtc.dev/fuseai/apis/fuse-business-api.md) · [All operations](https://skmtc.dev/fuseai/apis/fuse-business-api/llms.txt) · [OpenAPI document](https://skmtc.dev/fuseai/apis/fuse-business-api/revisions/50d95e0536f4?raw)
