Skip to main content
This guide walks the full loop from an idea (“US fintech CFOs”) to a populated list you can enrich, export, or push into a campaign. The flow is deliberately split into a cheap preview step and a billed save step, so you tune filters before you commit credits.
You need an API key with the search scope for every endpoint on this page, plus the lists scope for the final polling step — see authentication and scopes. Searching and saving both debit search credits; see credits.
1

Look up the accepted filter values

Enumerated filters (industries, seniority levels, locations, company sizes, and so on) match exact strings from a fixed vocabulary. A misspelled or paraphrased value does not return an error — it simply matches nothing, and your search comes back empty or oddly small. So before you write filters by hand, fetch the vocabulary:
Copy values verbatim, including casing. If a search that should obviously match returns nothing, a value that is not in filterOptions is the first thing to check.
2

Preview the search

POST /business/prospects/search runs the search and returns one page of matching profiles. Enumerated filters take an array of { "status": "include" | "exclude", "value": "..." } objects — exclude flips a value into an exclusion. size controls the page size (1–100, default 10).
Profiles carry identity fields only — firstName, lastName, jobTitle, companyName, linkedinUrl. Emails, phones, and the rest arrive when you save to a list and enrichment runs.To fetch the next page, repeat the request with the same filters and the scrollToken from the previous response in the body. See pagination for how scroll tokens behave.Each page you fetch debits search credits, so keep size small while you tune filters. Previewing is the cheap way to tune filters before you commit to saving.
The filters object accepts three shapes of field, plus a rangeInputs object for numeric ranges:rangeInputs sits alongside the other filters and takes { "min": number, "max": number } objects for job_company_employee_count, inferred_years_experience, and job_company_total_funding_raised:
3

Save the results into a list

When the preview looks right, save the matches with POST /business/prospects/search/save-to-list. Send the same filters, a limit for how many rows to save (1–500, required), and a destination: listName to create a new list, or listId to add to an existing one.
The response is a 202: the job has started, not finished. The search runs server-side, and contacts appear in the list as enrichment completes.Note that preview and save use different sizing fields on purpose: size is a page size for browsing results, while limit is the total number of rows the save job will pull and enrich.
This endpoint runs its own search — it does not reuse results from a previous POST /prospects/search. Passing the same filters to both endpoints pays for the search twice. Preview with a small size to tune filters, then save once. If cost matters most, skip the preview entirely and call save-to-list directly. Hand-picking a subset of previewed profiles to save is not supported; narrow filters instead. See credits.
4

Poll the list until it fills

Read the list’s rows and watch pagination.totalRecords. The save job is done when the count stops growing between polls.
This endpoint uses page-number pagination (pageNum and limit, max 1000 per page) rather than scroll tokens — see pagination. A wrong or inaccessible listId returns a 404 with the standard error envelope:
Saved searches let you rerun a query you have already tuned, without carrying the filter JSON around. GET /business/saved-searches lists the searches saved on your account, whether they were saved from the Fuse app or the API:
Replay one with POST /business/saved-searches/{savedSearchId}/run. The response looks like a normal search page, plus one extra field:
ignoredFilterKeys lists any stored filter keys that could not be translated into search fields. This happens with stale saved searches — ones saved against filter names that have since changed. Ignored filters are dropped, not approximated, so a non-empty array means the replay ran with fewer constraints than the original search and the results are broader than what you saved.
Check ignoredFilterKeys before acting on replayed results. If it is non-empty, recreate the search with current filter keys (start from step 1) rather than saving a broader-than-intended result set to a list.

Next steps

Add custom columns

Attach your own fields to the list and fill them per contact.

Export the list

Start an export job, poll it, and download the CSV.

Launch a campaign

Turn the list into a sequenced outreach campaign.

Upload your own contacts

Bring existing contacts into a list instead of searching.