curl --request GET \
--url https://api.tryfuse.ai/api/v1/business/contacts/dedupe-jobs/{jobId} \
--header 'Authorization: Basic <encoded-value>'import requests
url = "https://api.tryfuse.ai/api/v1/business/contacts/dedupe-jobs/{jobId}"
headers = {"Authorization": "Basic <encoded-value>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Basic <encoded-value>'}};
fetch('https://api.tryfuse.ai/api/v1/business/contacts/dedupe-jobs/{jobId}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"dedupeJob": {
"jobId": "68a1f5209c41d20014b3eb11",
"kind": "scan",
"status": "completed",
"scanResult": {
"matchFields": [
"email"
],
"totalGroups": 1,
"totalDuplicateContacts": 2,
"totalContactsScanned": 4056,
"truncated": false,
"skippedOversizedGroups": 0,
"pagination": {
"pageNum": 1,
"totalPages": 1,
"totalRecords": 1
},
"groups": [
{
"groupId": "3f6c2a9d1b8e4c7f",
"matchedValues": {
"email": "ada@brightpay.com"
},
"groupSize": 2,
"contactIds": [
"68a1f2c89c41d20014b3e955",
"68a1f2c89c41d20014b3e956"
],
"lists": [
{
"id": "68a1f20b9c41d20014b3e901",
"name": "European fintech Series A"
}
],
"listCount": 1,
"mergePreview": {
"winnerContactId": "68a1f2c89c41d20014b3e955",
"firstName": "Ada",
"lastName": "Nwosu",
"jobTitle": "Head of Payroll",
"linkedinUrl": "https://www.linkedin.com/in/ada-nwosu",
"industry": "Financial Services",
"kind": "canonical",
"companyName": "Brightpay",
"companyDomain": "brightpay.com",
"location": "Dublin, Leinster, Ireland",
"primaryEmail": "ada@brightpay.com",
"emailCount": 2,
"emails": [
{
"email": "ada@brightpay.com",
"status": "valid",
"isPersonal": false
},
{
"email": "ada.nwosu@gmail.com",
"status": "valid",
"isPersonal": true
}
],
"primaryPhone": "+353871234567",
"phoneCount": 1,
"phones": [
{
"phoneNumber": "+353871234567",
"status": "valid"
}
]
},
"contacts": [
{
"contactId": "68a1f2c89c41d20014b3e955",
"firstName": "Ada",
"lastName": "Nwosu",
"jobTitle": "Head of Payroll",
"linkedinUrl": "https://www.linkedin.com/in/ada-nwosu",
"kind": "canonical",
"companyName": "Brightpay",
"companyDomain": "brightpay.com",
"createdAt": "2026-05-02T09:14:33.000Z",
"location": "Dublin, Leinster, Ireland",
"primaryEmail": "ada@brightpay.com",
"emailCount": 1,
"emails": [
{
"email": "ada@brightpay.com",
"status": "valid",
"isPersonal": false
}
],
"primaryPhone": "+353871234567",
"phoneCount": 1,
"phones": [
{
"phoneNumber": "+353871234567",
"status": "valid"
}
]
},
{
"contactId": "68a1f2c89c41d20014b3e956",
"firstName": "Ada",
"lastName": "Nwosu",
"jobTitle": null,
"linkedinUrl": null,
"kind": "custom",
"companyName": "Brightpay",
"companyDomain": null,
"createdAt": "2026-08-11T16:40:02.000Z",
"location": null,
"primaryEmail": "ada@brightpay.com",
"emailCount": 2,
"emails": [
{
"email": "ada@brightpay.com",
"status": "valid",
"isPersonal": false
},
{
"email": "ada.nwosu@gmail.com",
"status": "valid",
"isPersonal": true
}
],
"primaryPhone": null,
"phoneCount": 0,
"phones": []
}
]
}
]
},
"mergeResult": null,
"error": null
}
}{
"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>"
}
}Poll a dedupe scan or merge job (groups / totals when completed)
Polls a dedupe job started by POST /business/contacts/dedupe-scan or POST /business/contacts/dedupe-merge; kind says which of the two the id names. status moves pending > processing > completed or failed; poll every few seconds until it is terminal. On a completed scan, scanResult carries one PAGE of the duplicate groups (pageNum/limit, default 50 per page, largest groups first; scanResult.pagination says how many pages there are — page through once status is completed rather than re-fetching every group on every poll). Each group carries its contactIds (every member), matchedValues (the normalized values it matched on), the lists its members live in, a preview of up to 25 member contacts, and a mergePreview of the contact the group would merge into — its surviving winnerContactId, filled fields, and the combined emails/phones unions (first 10 entries each; emailCount/phoneCount are the full totals). Each group’s groupId is what POST /business/contacts/dedupe-merge selects by. totalGroups counts every group the scan FOUND and can exceed the stored 200 (truncated says so); pagination.totalRecords counts the stored, pageable groups. On a completed merge, mergeResult carries mergedGroups, archivedContacts and skippedGroups (groups that no longer had two live members when the merge ran, or whose members’ identities conflict). On failed, error is DEDUPE_FAILED — start a new job. Scan results expire with the job (about 24 hours); export jobs are not served here (poll GET /business/exports/). Serves only the token owner’s own jobs. Rate limit: 120 requests per minute, 10,000 per day on the contacts bucket, which every /business/contacts endpoint shares.
Errors:
404JOB_NOT_FOUND— No dedupe job with that id (it may have expired, belong to another workspace, or be an export job).422VALIDATION_FAILED— jobId is not a 24-hex id.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.
Requires one of the following token scopes: contacts.
curl --request GET \
--url https://api.tryfuse.ai/api/v1/business/contacts/dedupe-jobs/{jobId} \
--header 'Authorization: Basic <encoded-value>'import requests
url = "https://api.tryfuse.ai/api/v1/business/contacts/dedupe-jobs/{jobId}"
headers = {"Authorization": "Basic <encoded-value>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Basic <encoded-value>'}};
fetch('https://api.tryfuse.ai/api/v1/business/contacts/dedupe-jobs/{jobId}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"dedupeJob": {
"jobId": "68a1f5209c41d20014b3eb11",
"kind": "scan",
"status": "completed",
"scanResult": {
"matchFields": [
"email"
],
"totalGroups": 1,
"totalDuplicateContacts": 2,
"totalContactsScanned": 4056,
"truncated": false,
"skippedOversizedGroups": 0,
"pagination": {
"pageNum": 1,
"totalPages": 1,
"totalRecords": 1
},
"groups": [
{
"groupId": "3f6c2a9d1b8e4c7f",
"matchedValues": {
"email": "ada@brightpay.com"
},
"groupSize": 2,
"contactIds": [
"68a1f2c89c41d20014b3e955",
"68a1f2c89c41d20014b3e956"
],
"lists": [
{
"id": "68a1f20b9c41d20014b3e901",
"name": "European fintech Series A"
}
],
"listCount": 1,
"mergePreview": {
"winnerContactId": "68a1f2c89c41d20014b3e955",
"firstName": "Ada",
"lastName": "Nwosu",
"jobTitle": "Head of Payroll",
"linkedinUrl": "https://www.linkedin.com/in/ada-nwosu",
"industry": "Financial Services",
"kind": "canonical",
"companyName": "Brightpay",
"companyDomain": "brightpay.com",
"location": "Dublin, Leinster, Ireland",
"primaryEmail": "ada@brightpay.com",
"emailCount": 2,
"emails": [
{
"email": "ada@brightpay.com",
"status": "valid",
"isPersonal": false
},
{
"email": "ada.nwosu@gmail.com",
"status": "valid",
"isPersonal": true
}
],
"primaryPhone": "+353871234567",
"phoneCount": 1,
"phones": [
{
"phoneNumber": "+353871234567",
"status": "valid"
}
]
},
"contacts": [
{
"contactId": "68a1f2c89c41d20014b3e955",
"firstName": "Ada",
"lastName": "Nwosu",
"jobTitle": "Head of Payroll",
"linkedinUrl": "https://www.linkedin.com/in/ada-nwosu",
"kind": "canonical",
"companyName": "Brightpay",
"companyDomain": "brightpay.com",
"createdAt": "2026-05-02T09:14:33.000Z",
"location": "Dublin, Leinster, Ireland",
"primaryEmail": "ada@brightpay.com",
"emailCount": 1,
"emails": [
{
"email": "ada@brightpay.com",
"status": "valid",
"isPersonal": false
}
],
"primaryPhone": "+353871234567",
"phoneCount": 1,
"phones": [
{
"phoneNumber": "+353871234567",
"status": "valid"
}
]
},
{
"contactId": "68a1f2c89c41d20014b3e956",
"firstName": "Ada",
"lastName": "Nwosu",
"jobTitle": null,
"linkedinUrl": null,
"kind": "custom",
"companyName": "Brightpay",
"companyDomain": null,
"createdAt": "2026-08-11T16:40:02.000Z",
"location": null,
"primaryEmail": "ada@brightpay.com",
"emailCount": 2,
"emails": [
{
"email": "ada@brightpay.com",
"status": "valid",
"isPersonal": false
},
{
"email": "ada.nwosu@gmail.com",
"status": "valid",
"isPersonal": true
}
],
"primaryPhone": null,
"phoneCount": 0,
"phones": []
}
]
}
]
},
"mergeResult": null,
"error": null
}
}{
"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.
Path Parameters
24-character hex id of an async job, as returned with the 202 that started it (POST /business/lists/{listId}/export).
Query Parameters
1-based page number over the scan's stored groups (default 1); groups are ordered largest first.
x >= 1Page size: how many duplicate groups to return per page (1-200, default 50). A scan stores at most 200 groups, so limit=200 returns the whole result in one page.
1 <= x <= 200Response
Success
Show child attributes
Show child attributes