curl --request POST \
--url https://api.tryfuse.ai/api/v1/business/contacts/dedupe-merge \
--header 'Authorization: Basic <encoded-value>' \
--header 'Content-Type: application/json' \
--data '
{
"scanJobId": "<string>"
}
'import requests
url = "https://api.tryfuse.ai/api/v1/business/contacts/dedupe-merge"
payload = { "scanJobId": "<string>" }
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({scanJobId: '<string>'})
};
fetch('https://api.tryfuse.ai/api/v1/business/contacts/dedupe-merge', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"jobId": "68a1f6039c41d20014b3ec42"
}{
"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>"
}
}Merge the duplicate groups a completed scan found
Merges the duplicate groups a completed scan found — every group, or just the groupIds subset (16-hex groupId values from the scan result). Async: 202 returns a jobId; poll GET /business/contacts/dedupe-jobs/{jobId} until status is completed, then read mergeResult for the totals. Within each group the surviving contact is chosen by the merge contract (a Fuse contact beats a custom one; among custom-only groups the most recently created wins), its empty fields are filled from the other members, all emails and phones are combined, custom-column values are carried over, and the losing contacts are archived with their list memberships repointed to the survivor — every list that held a duplicate ends up holding the surviving contact instead. Merging cannot be undone. Two Fuse contacts with conflicting identities (different PDL ids or different LinkedIn URLs) are never combined, even when the scan grouped them; such groups are split or skipped, so mergeResult.mergedGroups can be lower than the number of groups submitted. The scan job must be completed (409 SCAN_NOT_COMPLETED while it still runs) and is consumed as stored — unknown groupIds merge nothing. Rate limit: 120 requests per minute, 10,000 per day on the contacts bucket, which every /business/contacts endpoint shares.
Errors:
404SCAN_NOT_FOUND— No dedupe scan job with that id (it may have expired or belong to another workspace).409SCAN_NOT_COMPLETED— The scan is still running — poll it until status is completed, then retry.422SCAN_HAS_NO_GROUPS— The scan completed but found no duplicate groups; there is nothing to merge.422VALIDATION_FAILED— scanJobId is not a 24-hex id, or groupIds carries something other than 1-200 unique 16-hex ids.429RATE_LIMITED— More than 120 requests per minute or 10,000 per day on the contacts bucket, which every /business/contacts endpoint shares; retry after Retry-After.500UNEXPECTED_ERROR— The request could not be completed; quote request_id to support.
Requires one of the following token scopes: contacts.
curl --request POST \
--url https://api.tryfuse.ai/api/v1/business/contacts/dedupe-merge \
--header 'Authorization: Basic <encoded-value>' \
--header 'Content-Type: application/json' \
--data '
{
"scanJobId": "<string>"
}
'import requests
url = "https://api.tryfuse.ai/api/v1/business/contacts/dedupe-merge"
payload = { "scanJobId": "<string>" }
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({scanJobId: '<string>'})
};
fetch('https://api.tryfuse.ai/api/v1/business/contacts/dedupe-merge', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"jobId": "68a1f6039c41d20014b3ec42"
}{
"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
Id of a completed dedupe scan job — the jobId returned by POST /business/contacts/dedupe-scan.
Optional subset of the scan's groups to merge, by groupId (16-hex ids from the scan result's groups). Omit it to merge every group the scan found.
1 - 200 elementsResponse
Success
Id of the merge job; poll GET /business/contacts/dedupe-jobs/{jobId}.