API Reference / Merge e duplicati

Merge e duplicati

Due gruppi di endpoint che lavorano insieme: la rilevazione (read-only) propone i gruppi di probabili duplicati; il merge fonde due record, con anteprima prima e undo dopo. Le operazioni richiedono il permesso di delete sul modulo (fondere elimina il record perdente).

Endpoint
MetodoEndpointCosa fa
GET/api/duplicates/summaryConteggio dei gruppi di duplicati per modulo.
GET/api/duplicates?module=…I gruppi candidati di un modulo.
GET/api/merge/modulesI moduli su cui il merge è disponibile.
GET/api/merge/preview?module=&masterId=&loserId=Confronto read-only dei due record prima di fondere.
POST/api/mergeEsegue la fusione.
GET/api/merge/historyI merge recenti (query limit opzionale).
POST/api/merge/undoRipristina un merge: body { "mergeId" }.

01Rilevazione duplicati

GET /api/duplicates?module=accounts bearer richiesto

I gruppi candidati per un modulo. Ogni gruppo elenca i members (i record sospettati di essere la stessa entità) e matchedOn: per quali criteri combaciano. Es. stessa email, stessa P.IVA, nome simile (fuzzy, con la percentuale di somiglianza). Un modulo senza rilevazione configurata risponde 422.

Risposta · 200
json
{
  "success": true,
  "data": {
    "groups": [{
      "members": [ { "id": "41",  }, { "id": "87",  } ],
      "matchedOn": [
        { "type": "email", "label": "Stessa email" },
        { "type": "name_fuzzy", "label": "Nome simile", "value": "92%" }
      ]
    }]
  }
}

02Fusione

POST /api/merge bearer richiesto

Fonde il record perdente nel master: i record collegati (note, allegati, attività, lookup) vengono ri-puntati al master e il perdente viene eliminato. Con fields scegli, campo per campo, quale dei due valori tenere. Usa prima GET /api/merge/preview (stessi parametri in query) per il confronto.

Body
CampoTipoDescrizione
modulestringrichiestoIl modulo dei due record.
masterIdstringrichiestoIl record che sopravvive.
loserIdstringrichiestoIl record che viene fuso ed eliminato.
fieldsobjectopzionaleScelte per campo: { "campo": "master" | "loser" } (default: restano i valori del master).
Richiesta
curl -X POST https://crm.tuodominio.it/api/merge \
  -H "Authorization: Bearer <accessToken>" \
  -H "Content-Type: application/json" \
  -d '{ "module": "accounts", "masterId": "41", "loserId": "87", "fields": { "phone": "loser" } }'
const res = await fetch("https://crm.tuodominio.it/api/merge", {
  method: "POST",
  headers: { Authorization: `Bearer ${accessToken}`, "Content-Type": "application/json" },
  body: JSON.stringify({ module: "accounts", masterId: "41", loserId: "87" }),
});
Attenzione

Il merge è reversibile ma non all'infinito: l'undo (POST /api/merge/undo con il mergeId restituito dalla history) ripristina il record perdente e i collegamenti registrati al momento della fusione. Le modifiche fatte dopo il merge sul master non vengono toccate. Ogni merge e ogni undo finiscono nell'audit trail.