---
title: "Start an async duplicate-contact scan (returns a jobId)"
method: POST
path: "/business/contacts/dedupe-scan"
tags: ["Contacts"]
---

# Start an async duplicate-contact scan (returns a jobId)

`POST /business/contacts/dedupe-scan`

## Request

- Base URL: `https://api.tryfuse.ai/api/v1`
- URL: `https://api.tryfuse.ai/api/v1/business/contacts/dedupe-scan`
- Auth: HTTP basic

Starts an async scan of the workspace's saved contacts (the whole team's pool, Fuse and custom) for duplicates: contacts that match EXACTLY on every field in `matchFields`. The selection must carry at least one unique identifier (`linkedinUrl`, `email`, `phone`) or at least 3 profile fields (`fullName`, `jobTitle`, `industry`, `location`, `companyName`, `companyDomain`) — anything weaker would group unrelated people and is rejected. Async: 202 returns a `jobId`; poll `GET /business/contacts/dedupe-jobs/{jobId}` until `status` is `completed`, then read `scanResult.groups`. Each group carries a `mergePreview` (what the surviving contact will look like) so the result can be reviewed before anything is merged; scanning changes nothing and spends no credits. The result stores at most 200 groups (`truncated` is true when more were found — merge and scan again), and a group larger than 50 contacts is skipped as a too-weak selection (`skippedOversizedGroups` counts them). Rate limit: 120 requests per minute, 10,000 per day on the contacts bucket, which every /business/contacts endpoint shares.

Errors:
- `422` `VALIDATION_FAILED` — matchFields is missing, carries an unknown field, or fails the selection-strength rule.
- `429` `RATE_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.
- `500` `UNEXPECTED_ERROR` — The request could not be completed; quote request_id to support.

Requires one of the following token scopes: contacts.

## Request body

- object
  - `matchFields` string[], required: Fields duplicates must match exactly on: any combination of linkedinUrl, email, phone, fullName, jobTitle, industry, location, companyName, companyDomain. The selection must include at least one unique identifier (linkedinUrl, email or phone) OR at least 3 of the profile fields — a weaker selection would group unrelated people and is rejected.

## Response `202`

Success

- object
  - `jobId` string, required: Id of the scan job; poll GET /business/contacts/dedupe-jobs/{jobId} and pass it to POST /business/contacts/dedupe-merge.

## Other responses

- `400`: Error
- `401`: Error
- `402`: Error
- `403`: Error
- `404`: Error
- `409`: Error
- `422`: Error
- `429`: Error
- `500`: Error

---

[API](https://skmtc.dev/fuseai/apis/fuse-business-api.md) · [All operations](https://skmtc.dev/fuseai/apis/fuse-business-api/llms.txt) · [OpenAPI document](https://skmtc.dev/fuseai/apis/fuse-business-api/revisions/50d95e0536f4?raw)
