Skip to main content
Each entry lists what changed and what to check in your integration. The date is the day the change reached production.
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.
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.
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.
  • 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 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.
  • 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; 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, 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.
  • 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.
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.
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.
  • 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. 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. Refresh the Fuse connector in your client to load the new tool list.
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.
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. 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.
  • 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.
  • 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.
  • 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.
  • linkedin_url and the top-level linkedinUrl accept a bare slug or in/<slug> as well as a URL. See 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.
  • 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.
  • New company_filters narrows people by their current employer’s company search attributes, such as funding stage, technologies or industries. See Employer filters.
  • New error 422 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.
  • 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 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 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.
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.