Skip to main content
The endpoints under /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 apis answers 403 API_NOT_ON_PLAN.
  • credits come out of your workspace’s balance, the same one the app spends. Counts and company lookups are free whatever the plan lists.
  • perMinute and perDay are counted for this key alone: your other keys and your teammates’ keys do not share them. A call past either answers 429 RATE_LIMITED with a Retry-After header, 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. Send POST /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.
A new count runs in the background. The first answer is 202 with status: "pending" and the filters being counted:
Send the request again every few seconds with those filters in place of the query, until it answers 200 with status: "ready" and the total:
  • Repeat with the returned filters, never the query: a query is converted again on every call, and the new conversion can count a different search.
  • unresolvedCriteria (the parts of a query no filter could express) and closestCompanyMatches (each company the query named that had to be chosen among same-named companies) come back only on a query call, 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 200 at once.
  • filters is what was counted. Send it to POST /business/prospects/search or POST /business/companies/search to 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 answers 503 too.

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.
A company nothing matches answers 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_email or people_phone price is charged only when a value is found. status: "not_found", with the value null, costs nothing.
  • email.status is valid, risky (the domain accepts every address, so this one cannot be confirmed) or unknown, and email.type is work or personal. A phone comes back as { "value": "+14155550123" }.
  • linkedinUrl is 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 504 and 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 (no linkedinUrl, and no name with a company that resolves) answers 422 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.
The plan must include 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 index in people. Place rows by index: a person asked again after a busy provider can finish after the people sent behind them.
  • A row’s status is found, not_found, or not_identifiable when 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 jobId works 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 an X-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.