curl --request POST \
--url https://api.tryfuse.ai/api/v1/business/prospects/search \
--header 'Authorization: Basic <encoded-value>' \
--header 'Content-Type: application/json' \
--data '{}'import requests
url = "https://api.tryfuse.ai/api/v1/business/prospects/search"
payload = {}
headers = {
"Authorization": "Basic <encoded-value>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Basic <encoded-value>', 'Content-Type': 'application/json'},
body: JSON.stringify({})
};
fetch('https://api.tryfuse.ai/api/v1/business/prospects/search', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"profiles": [
{
"_id": "6a8dde1f5792025bcc9e9f61",
"pdlId": "gAkE2YBBdEZJ1b2iSrUKCQ_0000",
"linkedin_url": "linkedin.com/in/chrismumford",
"dataset_version": "35.1",
"pdl_version": "35.1",
"job_change_detected_at": null,
"createdAt": "2026-08-25T18:25:35.591Z",
"updatedAt": "2026-08-25T18:46:35.308Z",
"full_name": "chris mumford",
"sex": "male",
"industry": "real estate",
"job_title": "chief marketing officer - marketplaces",
"job_title_role": "marketing",
"job_title_class": "sales_and_marketing",
"job_title_levels": [
"cxo"
],
"job_company_name": "costar group",
"job_company_website": "costargroup.com",
"location_name": "richmond, virginia, united states",
"profile_score": "positive signals",
"activity_score": "positive signals",
"savedProfile": false,
"savedBy": null,
"linkedinConnectedAccountIds": [],
"linkedinInvitationSentAccountIds": []
},
{
"_id": "6a8de30b1ea5e58766c32c42",
"pdlId": "aNNNUa3WaybVUGXWxsXcLw_0000",
"createdAt": "2026-08-25T18:46:35.293Z",
"updatedAt": "2026-08-25T18:46:35.293Z",
"full_name": "jack garnett",
"sex": "male",
"linkedin_url": "linkedin.com/in/jack-garnett-049b21a",
"industry": "commercial real estate",
"job_title": "president",
"job_title_role": "operations",
"job_title_sub_role": "executive",
"job_title_class": "general_and_administrative",
"job_title_levels": [
"cxo"
],
"job_company_name": "costar group",
"job_company_website": "costargroup.com",
"location_name": "jacksonville, florida, united states",
"profile_score": "positive signals",
"activity_score": "positive signals",
"dataset_version": "35.1",
"pdl_version": "35.1",
"savedProfile": false,
"savedBy": null,
"linkedinConnectedAccountIds": [],
"linkedinInvitationSentAccountIds": []
}
],
"scrollToken": "22116$3.0004656",
"total": 8,
"filters": {
"job_title_levels": [
{
"status": "include",
"value": "cxo"
}
],
"location_country": [
{
"status": "include",
"value": "united states"
}
],
"job_company_name": "costar group"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}Run a people search
Run a people search. The filter source is exactly one of: literal filters, a stored PEOPLE saved search (savedSearchId or savedSearchName), or a natural-language query (the product’s smart search converts the prose into filters; criteria it could not map come back as unresolvedCriteria). Sending two sources is a 422. A saved search resolves to its filters and echoes ignoredFilterKeys for stored keys with no search field; a company saved search answers 422 SAVED_SEARCH_TYPE_MISMATCH.
The response always echoes the RESOLVED filters — reuse them verbatim to page, refine, or POST /prospects/search/save-to-list — plus the true match total and a scrollToken for the next page (send it back with the same filter source; it is null when there is no continuation).
Rows are the provider’s person record in snake_case, so the fields present vary by person, plus Fuse’s own keys: pdlId (the provider’s person id; absent on the rare row the profile cache could not store), _id (our stable id for the cached person record, present unless that row could not be cached), savedProfile / savedBy (whether this person is already a contact of yours), and linkedinConnectedAccountIds / linkedinInvitationSentAccountIds (which of your connected LinkedIn accounts already reached them). Rows carry no email address or phone number — searching is discovery only. Contact details you have already enriched for some of these people are stripped too, so a row never depends on your enrichment history; use /prospects/search/save-to-list with enrich to obtain contact details.
Billing: 2 credits per requested profile are pre-checked and 2 credits per profile returned are debited. (Enforced by the public row transformer, which removes Fuse’s enrichment overlay and the provider’s own work_email, personal_emails, recommended_personal_email, mobile_phone and phone_numbers before the row is returned.)
Errors:
402INSUFFICIENT_CREDITS— The balance does not cover the pre-check for this request; nothing was billed.404SAVED_SEARCH_NOT_FOUND— No saved search of yours has that id or exact title.409SAVED_SEARCH_NAME_AMBIGUOUS— Two of your saved searches share that title — reference it bysavedSearchIdinstead.422VALIDATION_FAILED— The request failed the declared schema;paramnames the offending key andmessagequotes the rule it broke.422SAVED_SEARCH_TYPE_MISMATCH— The saved search exists but stores the other kind of filters;paramissavedSearchId.422SAVED_SEARCH_INVALID— The STORED filters no longer form a runnable search — every value was retired, or the blob translates to nothing.422QUERY_FILTERS_INVALID— The natural-languagequeryproduced no usable filter; name concrete criteria.422SEARCH_FILTERS_INVALID— The provider rejected the assembled query as malformed — a filter value is the wrong shape for its field.429RATE_LIMITED— Per-token rate limit for this bucket exhausted; retry after the window in the RateLimit-Reset header.500UNEXPECTED_ERROR— The request failed inside the service; nothing was billed and the request_id identifies the failure.
Requires one of the following token scopes: search.
curl --request POST \
--url https://api.tryfuse.ai/api/v1/business/prospects/search \
--header 'Authorization: Basic <encoded-value>' \
--header 'Content-Type: application/json' \
--data '{}'import requests
url = "https://api.tryfuse.ai/api/v1/business/prospects/search"
payload = {}
headers = {
"Authorization": "Basic <encoded-value>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Basic <encoded-value>', 'Content-Type': 'application/json'},
body: JSON.stringify({})
};
fetch('https://api.tryfuse.ai/api/v1/business/prospects/search', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"profiles": [
{
"_id": "6a8dde1f5792025bcc9e9f61",
"pdlId": "gAkE2YBBdEZJ1b2iSrUKCQ_0000",
"linkedin_url": "linkedin.com/in/chrismumford",
"dataset_version": "35.1",
"pdl_version": "35.1",
"job_change_detected_at": null,
"createdAt": "2026-08-25T18:25:35.591Z",
"updatedAt": "2026-08-25T18:46:35.308Z",
"full_name": "chris mumford",
"sex": "male",
"industry": "real estate",
"job_title": "chief marketing officer - marketplaces",
"job_title_role": "marketing",
"job_title_class": "sales_and_marketing",
"job_title_levels": [
"cxo"
],
"job_company_name": "costar group",
"job_company_website": "costargroup.com",
"location_name": "richmond, virginia, united states",
"profile_score": "positive signals",
"activity_score": "positive signals",
"savedProfile": false,
"savedBy": null,
"linkedinConnectedAccountIds": [],
"linkedinInvitationSentAccountIds": []
},
{
"_id": "6a8de30b1ea5e58766c32c42",
"pdlId": "aNNNUa3WaybVUGXWxsXcLw_0000",
"createdAt": "2026-08-25T18:46:35.293Z",
"updatedAt": "2026-08-25T18:46:35.293Z",
"full_name": "jack garnett",
"sex": "male",
"linkedin_url": "linkedin.com/in/jack-garnett-049b21a",
"industry": "commercial real estate",
"job_title": "president",
"job_title_role": "operations",
"job_title_sub_role": "executive",
"job_title_class": "general_and_administrative",
"job_title_levels": [
"cxo"
],
"job_company_name": "costar group",
"job_company_website": "costargroup.com",
"location_name": "jacksonville, florida, united states",
"profile_score": "positive signals",
"activity_score": "positive signals",
"dataset_version": "35.1",
"pdl_version": "35.1",
"savedProfile": false,
"savedBy": null,
"linkedinConnectedAccountIds": [],
"linkedinInvitationSentAccountIds": []
}
],
"scrollToken": "22116$3.0004656",
"total": 8,
"filters": {
"job_title_levels": [
{
"status": "include",
"value": "cxo"
}
],
"location_country": [
{
"status": "include",
"value": "united states"
}
],
"job_company_name": "costar group"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}Authorizations
Your API token (af_…) as the Basic-auth username, with an empty password.
Body
Exactly one filter source — filters, savedSearchId, savedSearchName or query — plus optional paging. With filters, at least one non-empty filter value, a linkedinUrl or a scrollToken is required, and enum-backed values must come from GET /prospects/filter-options (422 otherwise, before anything is billed).
Literal filters, one of the four filter sources. People filters in the search vocabulary: include/exclude fields take [{ status, value }] entries, term fields a string or an array of strings, rangeInputs { min, max } ranges — every field and its accepted values are listed by GET /prospects/filter-options. On this endpoint a value outside a field's listed vocabulary is refused with 422 VALIDATION_FAILED, naming the field and the value, before anything is billed.
Show child attributes
Show child attributes
Id of one of your PEOPLE saved searches to take the filters from instead of filters (a company saved search answers 422 SAVED_SEARCH_TYPE_MISMATCH).
Exact title of one of your people saved searches to take the filters from instead of filters; two searches sharing the title answer 409 SAVED_SEARCH_NAME_AMBIGUOUS.
1 - 255Natural-language description of who to find (max 2000 chars), converted into filters server-side instead of filters; criteria that could not be mapped come back as unresolvedCriteria, and a query yielding no filter answers 422 QUERY_FILTERS_INVALID.
1 - 2000Profiles per page (1-100, default 10); the search pre-checks 2 credits per requested profile and debits 2 credits per profile returned.
1 <= x <= 100The scrollToken returned by the previous page, sent together with the same filter source, to fetch the next page.
A LinkedIn profile URL to look up one person (normalised before matching); counts as search criteria on its own.
Response
Success
Show child attributes
Show child attributes
Send back as scrollToken with the same filter source to fetch the next page; null when the provider returned no continuation.
Total number of people matching the filters, not the page size.
The RESOLVED filters the search actually ran, in the POST /prospects/search vocabulary.
Only when the source was a saved search: stored keys with no equivalent search field, which were dropped.
Only when the source was query: criteria in the prose that could not be turned into a filter.