---
title: "Save people-search results into a list"
method: POST
path: "/business/prospects/search/save-to-list"
tags: ["Prospect search"]
---

# Save people-search results into a list

`POST /business/prospects/search/save-to-list`

## Request

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

Run the search server-side and save up to `limit` matches into a contact list. The filter source is exactly one of `filters`, a saved search (`savedSearchId` / `savedSearchName`), or a natural-language `query` — the same contract as POST /prospects/search. The destination is exactly one of `listId` or `listName`; `listName` is create-or-reuse by exact name (case-insensitive), a name shared by two lists is a 409, and system list names are refused.

`enrich` selects what runs on the saved rows: `none` (default) saves the search rows as-is at 2 credits per row; `email`, `phone` or `phone_and_email` run the enrichment waterfall while saving (50 / 200 / 250 credits per row pre-checked), and rows already carrying the requested data are not re-charged. Only the enrichment modes report `totalContacts`, `estimatedMinutes`, and the run's `jobId` and `status` (`pending` while it waits behind your other enrichment job, `processing` once it runs): poll `GET /business/jobs/{jobId}` for its status and counts. A run whose balance runs out mid-run pauses (`stopped`) and is resumed from the app.

An optional `campaignId` XOR `campaignName` attaches the destination list to that campaign in the same motion, and the response's `campaign.attached` says whether that succeeded — a failed attach never retracts a started save. The attach happens when the save STARTS: a draft campaign enrols the full list at approval, while an ACTIVE non-dynamic campaign enrols only the rows present at attach time.

Always async: 202 means the job started, not that the list is populated — poll the list's rows. Billing: this runs its own search, it does NOT reuse a prior POST /prospects/search, so previewing first and then saving pays for the search twice. Saving a hand-picked subset of results is not supported; narrow the filters instead.

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.
- `404` `CAMPAIGN_NOT_FOUND` — No campaign of yours matches `campaignId` / `campaignName`; nothing was saved.
- `404` `LIST_NOT_FOUND` — With `enrich` other than `none`: `listId` is not one of your lists, or it was deleted before the save started. Nothing was saved or billed.
- `409` `SAVED_SEARCH_NAME_AMBIGUOUS` — Two of your saved searches share that title — reference it by `savedSearchId` instead.
- `409` `CAMPAIGN_NAME_AMBIGUOUS` — Two of your campaigns share that name — pass `campaignId` instead.
- `409` `LIST_NAME_AMBIGUOUS` — Two of your lists share that name — pass `listId` instead.
- `409` `LIST_NAME_TAKEN` — With `enrich` other than `none`: the new list for `listName` could not be created because the name was taken in the meantime. Retry, or pass `listId`. Nothing was saved or billed.
- `409` `ALL_CONTACTS_ALREADY_ENRICHED` — Every matching row already carries the requested enrichment — nothing to run and nothing billed.
- `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` `LIST_NAME_RESERVED` — `listName` is a system/dynamic list title and cannot be a destination.
- `422` `CAMPAIGN_LIST_CAP_REACHED` — The campaign already holds the maximum number of attached lists; nothing was saved.
- `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` | `query`), exactly one destination (`listId` | `listName`), an optional campaign (`campaignId` | `campaignName`, never both), plus `limit` and `enrich`.
  - `filters` object: Literal filters, one of the four filter sources — the same vocabulary as POST /prospects/search. 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. Must contain at least one non-empty value.
    - `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.
  - `limit` integer, required: Maximum number of matching profiles to save (1-10000). Credits are pre-checked per row before the job starts: 2 with `enrich: none`, otherwise the enrichment price per row (402 INSUFFICIENT_CREDITS when the balance is short).
  - `listId` string: Id of an existing contact list to save into (exactly one of `listId` / `listName`).
  - `listName` string: Name of the destination contact list, created when none exists; an existing list with the same name (case-insensitive) is reused, a name shared by several lists answers 409 LIST_NAME_AMBIGUOUS, and system list names answer 422 LIST_NAME_RESERVED.
  - `enrich` 'none' | 'email' | 'phone' | 'phone_and_email': What to run on the saved rows: `none` (default) saves the search rows as-is for 2 credits per row; `email` (pre-checks 50 credits per row), `phone` (200) or `phone_and_email` (250) run the enrichment waterfall while saving — rows already carrying the requested data are not re-charged.
  - `campaignId` string: Id of one of your campaigns to attach the destination list to once the save has started (optional; exactly one of `campaignId` / `campaignName`).
  - `campaignName` string: Exact name of one of your campaigns to attach the destination list to (optional); no match answers 404 CAMPAIGN_NOT_FOUND and a shared name 409 CAMPAIGN_NAME_AMBIGUOUS.

## Response `202`

Success

- object
  - `listIds` string[], required: Destination list ids the save is writing into (the reused list, or the one just created).
  - `enrich` 'none' | 'email' | 'phone' | 'phone_and_email', required: Echo of the enrichment mode the job is running.
  - `totalContacts` integer: Enrichment modes only: how many rows the job will process.
  - `estimatedMinutes` integer: Enrichment modes only: rough completion estimate.
  - `jobId` string: Enrichment modes only: the run's job, to poll at GET /business/jobs/{jobId}.
  - `status` 'pending' | 'processing': Enrichment modes only: pending while the job waits behind your other enrichment job, processing once it runs.
  - `campaign` object: Only when a campaign was requested.
    - `id` string, required
    - `attached` boolean, required: False when the attach failed after the save had already started; the save still runs.

## 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)
