Preview merging duplicate candidates
Shows exactly what POST /v1/candidates/{id}/merge would do with the same body, and changes nothing: what moves to the kept candidate (reports, interviews, hiring decisions, talent history), the fields it gains or keeps, two reports for the same job (every report is kept), clashing decisions (the more recent stays), and blockers that would stop a merge right now.
Required scope: candidates:read (candidates:write also works).
Errors
- 400:
invalid_content_type,invalid_json,request_body_too_large,unknown_field - 401:
authentication_required,invalid_api_key - 403:
api_access_disabled,insufficient_scope - 404:
candidate_not_found - 422:
invalid_parameter - 429:
rate_limit_exceeded - 500:
api_error - 503:
maintenance_mode,service_unavailable
ApiKeyAuthorizationBearer <probb_live_<id>_<secret>>id*stringThe candidate's ID.
1 <= length <= 200application/json- body
mergeIds*array<>The duplicate candidates to fold into this one, at most 10. List each once, and not the one you keep.
1 <= items <= 10Success.
application/json- response
object*stringkeeperId*stringThe record that stays.
keeperName*stringmergeable*booleanFalse while blockers is not empty: a merge now answers merge_work_in_progress or merge_not_ready.
blockers*array<>sources*array<>totals*irreversible*booleanA merge deletes the merged records and cannot be undone. Nothing is refunded.
# Set PROBB_URL and PROBB_API_KEY. Replace any *_VALUE placeholder and any example ID (such as job_example) with a real one.curl --fail-with-body -X POST "$PROBB_URL/api/v1/candidates/ID_VALUE/merge-preview" \ -H "Authorization: Bearer $PROBB_API_KEY" \ -H 'Content-Type: application/json' \ --data-binary '{ "mergeIds": [ "cand_duplicate_1", "cand_duplicate_2" ]}'{ "object": "candidate_merge_preview", "keeperId": "string", "keeperName": "string", "mergeable": true, "blockers": [ { "id": "string", "name": "string", "reason": "active_work", "message": "string" } ], "sources": [ { "id": "string", "name": "string", "fieldChanges": [ { "field": "string", "kept": "string", "dropped": "string" } ], "inheritsExternalId": true, "reports": -9007199254740991, "interviews": -9007199254740991, "decisions": -9007199254740991, "decisionConflicts": [ { "counterpart": "string", "kept": "string", "merged": "string", "winner": "kept" } ], "duplicateReportsFor": [ "string" ], "matchAssessments": -9007199254740991, "talentSearches": -9007199254740991 } ], "totals": { "reports": -9007199254740991, "interviews": -9007199254740991, "decisions": -9007199254740991 }, "irreversible": true}