Skip to main content
Searching is not the only way to fill a list. If you already have contacts — in a CRM, a spreadsheet, or another tool — you can push them into Fuse directly. The API upload takes the same path a CSV upload takes in the app: contacts are created as your workspace’s own records, and enrichment fills in missing fields asynchronously after the fact. This guide covers the full membership lifecycle: create a list, upload new contact data, add contacts that already exist in your workspace, and remove them again.
List endpoints require a key with the lists scope; resolving a contact id requires contacts. See scopes.
1

Create a list

Lists are the container everything else hangs off — exports, custom columns, and campaigns all start from a list.
entityType defaults to "contactList", which is what you want here. List names are unique within your workspace: creating a list with a name that already exists returns 409 LIST_NAME_TAKEN in the standard error envelope, so a safe pattern for repeated imports is to date-stamp the name.
2

Upload contact data

Send batches of raw contact records to the list. Each request accepts up to 500 contacts; loop over your dataset in batches for larger imports.
Each contact accepts the following fields. All are optional individually, but every contact must include at least one of email, linkedinUrl, firstName, or lastName — a record with none of these has nothing to identify or enrich.You do not need to send complete records. Enrichment runs asynchronously after the upload and fills gaps where it can, so a bare linkedinUrl or an email address is a workable starting point. The returned contactIds are the ids of the newly created contacts — keep them if you plan to manage membership later.
Re-uploading the same people creates duplicates. This endpoint always creates new contact records; it does not match against contacts already in your workspace. For people who already exist in Fuse, resolve their ids and use the /members endpoint instead.
3

Add existing contacts by id

When the contacts already exist in your workspace — from an earlier upload, a saved search, or another list — add them to a list by id rather than re-uploading their data:
Each request accepts up to 5,000 contact ids. Adding is idempotent: a contact that is already in the list is skipped, not duplicated. That is why addedCount can be lower than submittedCount — the difference is the number of contacts that were already members. You can safely retry a failed request without worrying about double-adding.
4

Remove contacts from a list

Removal uses the same endpoint with DELETE:
This removes the contacts from the list; it does not delete the contact records from your workspace.

Resolve a contact id from a LinkedIn URL

The /members endpoints work on contact ids, but CRMs rarely store Fuse ids. If your system keys people by LinkedIn URL, resolve the id first:
URLs are normalized server-side, so protocol, trailing slashes, and casing don’t matter — linkedin.com/in/Jordan-Lee/ resolves the same as https://www.linkedin.com/in/jordan-lee. If no contact in your workspace matches, you get 404 CONTACT_NOT_FOUND:
This gives you a clean sync pattern for recurring imports: for each person, try resolve first — on a hit, add the id via /members; on a 404, include the record in your next batch upload. That keeps repeat syncs from piling up duplicate contacts.

Where to next

Custom columns

Attach your own fields — CRM ids, owner, deal stage — to list rows.

Export a list

Pull enriched contacts back out as CSV once enrichment has filled the gaps.

Build a list from search

Fill a list from prospect search instead of an upload.

Campaigns

Put an uploaded list to work in an outbound campaign.