---
title: "Merge Workers"
method: POST
path: "/workers/merge"
tags: ["workers"]
---

# Merge Workers

`POST /workers/merge`

## Request

- Base URL: `https://app.tascan.io/api/v1`
- URL: `https://app.tascan.io/api/v1/workers/merge`
- Auth: HTTP bearer

Merge duplicate worker records into one canonical identity (Patent 4 identity consolidation). Reassigns every reference (completions, timer events, points, payments, rosters — 31 columns across 31 tables), backfills missing phone/email on the primary, sums points, and tombstones the duplicates (merged_into + is_active=false — NEVER hard-deletes). ALWAYS run with dry_run=true first and show Mike the counts; pass dry_run=false only after explicit confirmation.

## Request body

- object
  - `primary_worker_id` string, required: The canonical worker that survives (usually the one with a phone)
  - `duplicate_worker_ids` string[], required: Worker IDs to fold into the primary (max 20)
  - `dry_run` boolean: true (default) = report reassignment counts only, change nothing. false = execute atomically.

## Response `200`

Success. JSON body: { data: ... } or an error object { error, message }.

## Other responses

- `4XX`: Client error (validation, auth, scope, rate limit).

---

[API](https://skmtc.dev/tascan/apis/tascan-api.md) · [All operations](https://skmtc.dev/tascan/apis/tascan-api/llms.txt) · [OpenAPI document](https://skmtc.dev/tascan/apis/tascan-api/revisions/56fcd2861498?raw)
