/business/data each answer one question and save nothing to your Fuse workspace. They are built for products that call Fuse for their own users, so every call is priced and limited by the usage plan on the API key that makes it.
Every endpoint on this page needs the
data scope and a key with a usage plan. A key without one can call GET /business/data/pricing only: every other data endpoint answers 403 API_NOT_ON_PLAN. Fuse sets usage plans up per partner, so ask your Fuse contact for one.Usage plans
A usage plan belongs to one API key. For each data endpoint the key may call, it sets what one charged call costs in credits, and how many calls the key may make a minute and a day. Read your key’s plan:- An endpoint missing from
apisanswers403 API_NOT_ON_PLAN. creditscome out of your workspace’s balance, the same one the app spends. Counts and company lookups are free whatever the plan lists.perMinuteandperDayare counted for this key alone: your other keys and your teammates’ keys do not share them. A call past either answers429 RATE_LIMITEDwith aRetry-Afterheader, see Rate limits.
Count people or companies
A count is free and lists nobody, so use it to size or tune a search before you pay for rows. SendPOST /business/data/people/count the filter source POST /business/prospects/search takes, exactly one of a plain-English query, filters, or a saved search by savedSearchId or savedSearchName. POST /business/data/companies/count takes the filter source of POST /business/companies/search the same way. Neither takes paging fields.
202 with status: "pending" and the filters being counted:
filters in place of the query, until it answers 200 with status: "ready" and the total:
- Repeat with the returned
filters, never thequery: aqueryis converted again on every call, and the new conversion can count a different search. unresolvedCriteria(the parts of aqueryno filter could express) andclosestCompanyMatches(each company thequerynamed that had to be chosen among same-named companies) come back only on aquerycall, so keep them from the first answer.- A people count can take up to about a minute and a half, a company count usually a few seconds. A search counted in the last 15 minutes answers
200at once. filtersis what was counted. Send it toPOST /business/prospects/searchorPOST /business/companies/searchto list the matches.- A count that failed answers
503: retry in a minute. Each account starts at most 10 new people counts a minute and 500 a day, and past that a new people count answers503too.
Look up a company
POST /business/data/companies/resolve finds a company’s website domain, LinkedIn page and logo, for free. Send at least one of linkedinUrl, domain or name. When you send several, only the most precise is looked up, in that order. A name resolves to the best-known company of that name, so send a domain or a LinkedIn page for common names.
200 with status: "not_found" and company: null, never a guess. A field of company is null when it is not known. When the company data provider cannot answer in time the answer is 504, and when it is busy, 429 without a Retry-After header: retry shortly in both cases. To get the full company record, pass the domain to POST /business/companies/search as filters.domains.
Find a person’s email or phone
POST /business/data/people/email and POST /business/data/people/phone look one person up. Name them by linkedinUrl, the most precise, or by name with a companyName or companyDomain.
- The plan’s
people_emailorpeople_phoneprice is charged only when a value is found.status: "not_found", with the value null, costs nothing. email.statusisvalid,risky(the domain accepts every address, so this one cannot be confirmed) orunknown, andemail.typeisworkorpersonal. A phone comes back as{ "value": "+14155550123" }.linkedinUrlis the profile the lookup matched, or null.- A value Fuse already holds answers at once. Otherwise Fuse asks its data providers in turn, which takes about 10 to 25 seconds. When nothing is found in time the answer is
504and nothing is charged: retry. - Before anything is looked up, the balance must cover the price, or the answer is
402 INSUFFICIENT_CREDITS. A person who cannot be looked up (nolinkedinUrl, and nonamewith a company that resolves) answers422 PERSON_NOT_IDENTIFIABLE, free.
Verify an email
POST /business/data/emails/verify checks whether an address can be sent to.
status is valid, invalid (this includes addresses never to be sent to), risky (a catch-all domain that accepts every address) or unknown. Every verdict but unknown costs the plan’s email_verify price. A check that cannot finish in time answers 504, free: retry.
Enrich up to 100 people in one job
For more than a handful of people, start a job instead of calling the lookups one by one. It runs in the background, and each row is charged like a single lookup, only for the values found.people_enrich_jobs, and people_email or people_phone for each kind find asks for. Before the job starts, the balance must cover a value of every kind asked on every row, or the answer is 402 INSUFFICIENT_CREDITS and nothing runs.
Poll GET /business/data/people/enrich-jobs/{jobId} every few seconds:
- Each row carries its
indexinpeople. Place rows byindex: a person asked again after a busy provider can finish after the people sent behind them. - A row’s
statusisfound,not_found, ornot_identifiablewhen the person could not be looked up, which is free. - A job of 100 people takes a few minutes. Its lookups use only what live requests leave of each provider’s capacity, so it takes longer when providers are busy. A person no busy provider could be asked about yet is tried again every minute, for up to 15 minutes from the job’s start, and then answered
not_found. - Polling is free and counts against your account reads (120 a minute), not the plan. The
jobIdworks with this endpoint only:GET /business/jobs/{jobId}does not serve it. - Jobs are kept for 7 days. After that the poll answers
404 ENRICHMENT_JOB_NOT_FOUND.
Send an idempotency key
Send anX-Idempotency-Key header, such as a UUID, on the calls that charge: email and phone lookups, verification and starting a job. The same key with the same body is charged once however often it is sent, so a request that timed out on your side can be sent again safely. A job start sent again with its key answers the job it started instead of starting another, and if the start answered 500, sending it again with the same key queues the job it recorded. The same key with a different body is new work, and is charged.
Errors
The data endpoints answer with the standard error envelope. The answers to handle:
The counts also refuse what the searches refuse, such as a
query that names no concrete criteria (422 QUERY_FILTERS_INVALID) or a saved search that does not exist (404 SAVED_SEARCH_NOT_FOUND). Each endpoint’s page in the API reference lists every answer it gives, for example Count people matching a search.