> ## Documentation Index
> Fetch the complete documentation index at: https://docs.fuseai.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Changelog

> Changes to the Fuse Business API and MCP server that can affect an existing integration, newest first.

Each entry lists what changed and what to check in your integration. The date is the day the change reached production.

**October 21, 2026**

Demographics and company matches, company names in search, row fields, search suggestions, the job-changes watcher

**Prices**

* A demographics match costs 1 credit (was 2): `POST /business/lists/{listId}/enrich` with `mode: "demographics"`, and `POST /business/imports/{importId}/commit` with `enrich: "demographics"`. People nobody matches stay free.
* An import committed with `enrich` set to `email`, `phone` or `phone_and_email` matches its rows to people for free before it finds emails or phones. That match cost 2 credits a person before, and the balance check no longer reserves it.
* Over MCP, `import_people_to_list` in `DEMOGRAPHICS` mode costs 1 credit per person matched, and `import_companies_to_list` 1 credit per company matched (both were 2). Its `EMAIL`, `PHONE` and `EMAIL_AND_PHONE` modes match people for free, as above. See [Credits & billing](/concepts/credits.md).

**Search rows**

* Rows from `POST /business/prospects/search` and `POST /business/saved-searches/{savedSearchId}/run` carry `job_company_linkedin_url`: the LinkedIn company page of the employer in `job_company_name`, as `linkedin.com/company/<slug>` in lower case. It is left out when no company page is known. See [Row fields](/guides/build-a-list-from-search.md#row-fields).

**Filters**

* `job_company_name` and `experience.company.name` look up at most 500 names per filter on each search, instead of 100. Included names a search leaves out (past that, out of time, or names nobody has) no longer hold the rest back unnoticed: the response carries `unappliedCompanyNames`, one entry per filter with how many names were left out and how many are still to look up, and sending the same request again looks the next ones up. See [Company names](/guides/build-a-list-from-search.md#company-names).
* Excluded company names that could not be looked up (past the cap, out of time, or a failed lookup) now refuse the search with the new [`422 COMPANY_EXCLUDES_UNRESOLVED`](/concepts/errors#company_excludes_unresolved) instead of being left out, because running without them would return the people they exclude. Nothing is billed.
* Every include/exclude filter takes a bare string or an array of strings as include entries, next to the `[{ "status": "include", "value": "..." }]` form, so `"industry": "software"` works. `GET /business/prospects/filter-options` reports `valueShape: "include_exclude"` for all of them; the `include_exclude_or_string` shape is gone. See [Build a list from search](/guides/build-a-list-from-search.md).
* `languages.name` reads common other names as the listed language: farsi as persian, bangla as bengali, panjabi as punjabi, slovene as slovenian, chinese and mandarin as putonghua, tagalog and filipino as Tagalog/Filipino.
* A search has about 28 seconds. When its own lookups of company names, email addresses or phone numbers run out of time, it now answers `503` carrying [`UNEXPECTED_ERROR`](/concepts/errors#unexpected_error); the lookups that finished are kept, so the same request sent again gets further. `504` with the same code means the search provider took too long. Nothing is billed either way.
* A `scrollToken` whose filters, or the companies they name, changed since its first page is refused with the new [`422 SEARCH_CHANGED`](/concepts/errors#search_changed), and nothing is billed. Start again without it.

**Search suggestions**

* `GET /business/prospects/autocomplete` returns company, school and skill names in their own spelling instead of lower case. Titles, regions and locations stay lower case.
* `field=region` suggests only the state and region names people search can match, so every suggested region can be searched. `countries` lists the countries a region is in, no longer ordered by how likely each one is.

**Analytics**

* `contactsSearched` in `GET /business/analytics/enrichment` no longer counts the people an import matches for free before it finds their emails or phones: that match leaves no charge.

**Agents**

* The job-changes watcher (`POST /business/agents/job-changes-watcher`) bills 50 credits per watched contact on every check, instead of 50 per job change delivered, and its deliveries are free. It checks monthly unless you send `frequency`: `7` for weekly or `1` for daily. Starting it is free, but the balance must cover one check of every watched contact (`402 INSUFFICIENT_CREDITS`). See [Credits & billing](/concepts/credits.md).
* It watches every Fuse contact with a LinkedIn URL on its source lists; rows added by hand are skipped. Watchers created before this change keep the contacts they watched, plus anyone added to their lists since.
* `maxCreditSpend` caps how many contacts it watches on each check (`maxCreditSpend` / 50), no longer what it delivers in total. `maxContacts` still pauses it after that many deliveries.
* Each person's first check records their current job, so a move made before they were watched is not delivered.

**Duplicates**

* `POST /business/contacts/dedupe-merge` also keeps apart two contacts with different LinkedIn member ids. See [Groups that will not merge](/guides/deduplicate-contacts.md#groups-that-will-not-merge).

**MCP**

* `enrich_contact` and `single_enrichment_tool` read `input.firstName`, `input.lastName` and `input.domain`, as their descriptions say. Before, a call with only those was refused as invalid input, and a domain sent next to a company name was not used.
* `save_people_to_list` matches people the way imports do: by LinkedIn URL, by email, or by first and last name with a company the person works or worked at. A first name alone no longer finds anyone, and `needsChoice` is always empty.
* `create_job_changes_watcher_monitor` takes `frequency` and bills per watched contact on every check, as above.
* `search_people` and `prospect_search_tool` answer `SEARCH_LOOKUPS_TIMED_OUT` when the search's own lookups of company names, email addresses or phone numbers ran out of time. Nothing is charged, and searching again gets further because the lookups that finished are kept. See [Results and errors](/mcp/tools.md#results-and-errors).

**October 16, 2026**

Employer headcount on search rows, two-letter country codes, saving people over MCP

**Search rows**

* Rows from `POST /business/prospects/search` and `POST /business/saved-searches/{savedSearchId}/run` carry `job_company_employee_count`, the current employer's headcount as a whole number: the low end of the provider's estimate, so a company estimated at 51–200 people reads `51`. It is absent when the headcount is unknown. See [Row fields](/guides/build-a-list-from-search.md#row-fields).
* Save-to-list now stores that headcount with the company of each contact the save creates.

**Company search**

* `POST /business/companies/search` and its `save-to-list` accept a two-letter ISO country code (`US`, `DE`) in `headquartersCountryCode` and `officeLocationsV2`, and convert it to the three-letter `apiCode`. So does `officeLocationsV2` in people search's [`company_filters`](/guides/build-a-list-from-search#employer-filters). A two-letter code used to fail the whole search.

**MCP server**

* `save_people_to_list` replaces `upload_prospects_to_list`. It saves up to 25 people per call, found by `search_people` or named in the chat, after matching each one to their profile, and costs 1 credit per person it adds to the list. See [Tools & limits](/mcp/tools.md#credits). Refresh the Fuse connector in your client to load the new tool list.

**October 13, 2026**

People search: prices, rows, filters and paging

**Prices**

* `POST /business/prospects/search` costs 1 credit per profile returned (was 2).
* `POST /business/prospects/search/save-to-list` with `enrich: "none"` costs 1 credit per row saved (was 2). With `enrich` set, nothing changes: the save has no charge of its own and enrichment is billed per contact at its usual prices.
* `POST /business/companies/search` and its `save-to-list` cost 1 credit per company (was 2).
* Unchanged: enrichment and demographics prices. See [Credits & billing](/concepts/credits.md).

**Search rows**

* Rows no longer carry `_id` or `pdlId`. The person's LinkedIn member id is in the new `linkedinMemberId` field; it is not a Fuse record id. Use `linkedin_url` as the person's key.
* Rows have a fixed set of fields, listed in [Row fields](/guides/build-a-list-from-search.md#row-fields). `sex`, `job_title_class`, `profile_score`, `activity_score`, `dataset_version`, `pdl_version`, `job_change_detected_at`, `createdAt`, `updatedAt` and every other field outside that list are gone.
* A person with no current job is shown with the most recent job they left, and the row carries `job_end_date`, the date that job ended (YYYY-MM-DD, month precision; absent otherwise). Saving that row stores that job as the contact's job.
* `full_name` is the person's first and last name, cleaned of what people add on LinkedIn (titles, credentials, emoji). Names, job titles and company names come in display case instead of lower case. `industry` and `location_name` stay lower case, and `location_name` drops unknown parts from the front.

**Filters**

* 13 filters are removed, including the continent filters and sub-department. In literal `filters` they return `422 VALIDATION_FAILED` naming the filter; in saved searches they are skipped and listed in `ignoredFilterKeys`. See [Removed filters](/guides/build-a-list-from-search.md#removed-filters).
* `education.degrees` takes include entries only. An exclude entry returns `422 VALIDATION_FAILED`. Company size and revenue keep their exclude entries.
* `full_name`, `first_name` and `last_name` match loosely instead of as an exact term. See [Name filters](/guides/build-a-list-from-search.md#name-filters).
* `job_start_date` (months in current role) now means "started within the last N months". It accepts a number of months or a `YYYY-MM` month. See [Months in current role](/guides/build-a-list-from-search.md#months-in-current-role).
* `job_company_name` and `experience.company.name` match companies. Entries may carry `liOrgId` and `domain` to pick one company; names still work. `experience.company.name` now also takes include entries. A search looks up at most 100 new company names per field, and names past that apply from a later search, so identify companies by `liOrgId` or `domain` when you send more than 100. See [Company names](/guides/build-a-list-from-search.md#company-names).
* `linkedin_url` and the top-level `linkedinUrl` accept a bare slug or `in/<slug>` as well as a URL. See [LinkedIn profiles](/guides/build-a-list-from-search.md#linkedin-profiles).
* `work_email`, `personal_emails` and `mobile_phone` find the person who has that email address or phone number, then apply every other filter, instead of matching a stored address exactly. They take at most 10 values each, and a value nobody is known by finds no one. See [Email and phone filters](/guides/build-a-list-from-search.md#email-and-phone-filters).
* `job_title` also matches the common forms of a title. `keywords` and `excludedKeywords` match whole words, add plural and related forms, and ignore `*` and `?`. See [Job titles and keywords](/guides/build-a-list-from-search.md#job-titles-and-keywords).
* New `company_filters` narrows people by their current employer's company search attributes, such as funding stage, technologies or industries. See [Employer filters](/guides/build-a-list-from-search.md#employer-filters).
* New error [`422 FILTER_VALUE_UNRESOLVED`](/concepts/errors#filter_value_unresolved) when none of the company names, regions or LinkedIn profiles a filter includes can be matched, or no value of an email or phone filter is an email address or a phone number.
* A search whose filters narrow nothing, for example only exclude entries, returns `422 SEARCH_FILTERS_INVALID` instead of running.
* `job_title` with the `owner`, `partner`, `entry`, `training` or `unpaid` level keeps the level; a title that cannot carry it returns `422 SEARCH_FILTERS_INVALID`. See [Job titles and keywords](/guides/build-a-list-from-search.md#job-titles-and-keywords).
* A `rangeInputs` bound of 0 or less means no bound, so `{ "min": 50, "max": 0 }` finds 50 or more. A `min` above a `max` greater than 0 is still refused: `422 VALIDATION_FAILED` in literal `filters`, `422 SAVED_SEARCH_INVALID` from a saved search and `422 QUERY_FILTERS_INVALID` from a `query`. Company search's ranges read 0 the same way.
* A search that does not finish within 28 seconds is stopped with a `504` carrying the [`UNEXPECTED_ERROR`](/concepts/errors#unexpected_error) code, and nothing is billed. Trying again can work, because the company names, email addresses and phone numbers it looked up are kept; if it times out again, narrow it, for example with a job title or a location.
* `GET /business/prospects/filter-options` no longer lists the removed filters, `languages.name` offers a shorter list (a value outside it returns `422 VALIDATION_FAILED`), `experience.company.name` reports `valueShape: "include_exclude_or_string"`, and `jobTitleRoleToSubRole` is deprecated.

**Counts and paging**

* `total` is an estimate, returned on the first page only; later pages answer `null`, and the first page can be `null` too. Decide whether a search found anyone from `profiles`, not from `total`.
* `scrollToken` is opaque and longer than before. Any token this API did not issue, every token issued before this change included, returns [`422 SCROLL_TOKEN_INVALID`](/concepts/errors#scroll_token_invalid) on search and on saved-search runs, and nothing is billed. Start the search again without it.
* The last page answers `scrollToken: null`, and so does a profile lookup whose people all fit in `size`. A page can also come back a little short while more pages follow, so stop only on a `null` `scrollToken`. See [Pagination](/concepts/pagination.md#scroll-token-pagination).

**Analytics**

* `GET /business/analytics/enrichment` counts `contactsSearched` from the rows each search charge paid for, plus the contacts each demographics enrichment matched (a CSV upload, one contact or a whole list). Companies matched from a CSV upload are not counted, though some were before. Demographics run before this change are not counted.

**MCP server**

* `search_people` and `prospect_search_tool` stop a search that has not finished 28 seconds after the call and answer `SEARCH_TIMED_OUT`, with nothing charged. Other tools served by Fuse's backends keep their 60 seconds. See [Results and errors](/mcp/tools.md#results-and-errors).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.