Riferimento APIRichieste KYC

Richieste KYC

Riferimento API completo per le richieste KYC di Certivant — crea, elenca, invia, approva, rifiuta, inoltra e reinvia le richieste di verifica dell'identità di persone fisiche o aziende.

Una richiesta KYC rappresenta un singolo tentativo di verificare l'identità di una persona (INDIVIDUAL) oppure l'identità di un'azienda insieme ai suoi amministratori e titolari effettivi (BUSINESS). Ogni endpoint qui sotto si trova sotto /api/v1/kyc/requests.

Tutti gli endpoint richiedono una chiave API con l'ambito pertinente. Vedi Autenticazione.


Crea una richiesta

POST /api/v1/kyc/requests    Ambito: kyc:write

Crea una nuova richiesta nello stato PENDING_UPLOAD. I dati del richiedente sono facoltativi: se non vengono passati, sarà il richiedente a inserirli tramite la sessione ospitata.

Corpo della richiesta

{
  "type": "INDIVIDUAL",
  "purpose": "Financing an iPhone 16, 24 months",
  "externalRef": "your-id-here",
  "subTenantName": "Acme Corp",
  "subTenantExternalId": "cust_8842",
  "applicant": {
    "externalRef": "your-applicant-id",
    "fullName": "Jane Doe",
    "dateOfBirth": "1990-04-12",
    "nationality": "US",
    "email": "jane@example.com",
    "phone": "+14155551234",
    "emailVerified": false,
    "phoneVerified": false,
    "metadata": { "anyKey": "anyValue" }
  }
}
CampoTipoObbligatorioNote
typeenumsìINDIVIDUAL oppure BUSINESS
purposestringanoPerché sta verificando questa persona, in poche parole — es. Financing an iPhone 16, 24 months, Opening an account. 3–300 caratteri. Memorizzato in forma cifrata. Se non ne invia nessuno, Certivant usa la motivazione predefinita del modulo (formId), altrimenti «New customer verification» (sempre memorizzato in inglese). Si consiglia un motivo preciso: rende utile il controllo antifrode. Vedi Motivo della verifica
externalRefstringanoLa Sua chiave esterna. Restituita in ogni evento
subTenantNamestringanoModalità partner: nome visualizzato del cliente finale a cui appartiene la richiesta. Massimo 200 caratteri
subTenantExternalIdstringanoModalità partner: il Suo ID interno per quel cliente finale. Filtrabile nell'endpoint di elenco e riportato in ogni webhook. Massimo 200 caratteri
formIdstringanoCrea la verifica tramite uno dei Suoi moduli (si applicano i requisiti documentali del modulo e la richiesta gli viene attribuita). Il tipo del modulo deve corrispondere a type. Obbligatorio per una chiave API limitata a moduli specifici, e deve essere uno di questi — vedi Limitazione ai moduli
faceCheckSkippablebooleanonoOmesso: l'impostazione del modulo (formId), altrimenti quella della Sua organizzazione (la verifica del volto è obbligatoria salvo modifica). false forza la verifica del volto come obbligatoria. true offre l'alternativa non biometrica, solo dove la legge ne richiede una (ad es. Québec): il richiedente può rifiutare la verifica del volto. Non vengono quindi eseguiti né il selfie né la prova di vitalità, il documento d'identità viene comunque raccolto e la richiesta passa alla revisione manuale con una verifica dell'identità dal vivo consigliata. Un modulo può attivarla con "Consenti ai richiedenti di saltare la verifica del volto"; l'impostazione dell'organizzazione si trova in Impostazioni → KYC/B.
applicant.externalRefstringanoChiave esterna per il singolo richiedente, separata dal riferimento della richiesta
applicant.fullNamestringanoSe omesso, viene raccolto tramite sessione ospitata
applicant.dateOfBirthstringa (data ISO)noYYYY-MM-DD
applicant.nationalitystringa (ISO 3166-1 alpha-2)noPer esempio US, GB, FR
applicant.emailstringano
applicant.phonestringa (E.164)no
applicant.emailVerifiedbooleanonoImposti true se ha già verificato l'email dalla Sua parte
applicant.phoneVerifiedbooleanonoIdem — salta il passaggio di verifica telefonica di Certivant
applicant.metadataoggettonoJSON libero. Restituito nell'endpoint GET

Attribuzione partner / sub-tenant. Se gestisce verifiche per molti clienti finali all'interno di un'unica organizzazione (per esempio una piattaforma di firma elettronica che verifica i firmatari per centinaia di aziende), imposti subTenantName e subTenantExternalId su ogni richiesta. Può poi filtrare l'endpoint di elenco per subTenantExternalId, entrambi i campi vengono riportati in ogni webhook e la dashboard mette a disposizione un filtro per sub-tenant — il tutto senza creare un'organizzazione separata per ogni cliente.

Motivo della verifica

Ogni richiesta ha un motivo: perché si verifica la persona, in poche parole. Inviarlo è facoltativo, ma si consiglia un motivo preciso perché rende utile il controllo antifrode. Certivant legge il motivo e lo associa a una delle circa 110 voci di un elenco di motivi — ad esempio finanziamento di un telefono o dispositivo, piano mobile, attivazione di una SIM, prestito personale, carta di credito, noleggio auto, criptovalute, conto bancario, affitto di una casa, mutuo, firma dal notaio / atto, assicurazione, lavoro o verifica dell'età. Ogni motivo appartiene a una famiglia: Telefoni e dispositivi, Linee mobili e SIM, Prestiti e credito, Veicoli, Beni di alto valore, Movimenti di denaro e criptovalute, Apertura di conti, Affitto di una casa, Immobili e mutuo, Altro (nessun denaro in gioco) o Non chiaro.

  • Si confronta solo la famiglia. La rete di prevenzione delle frodi confronta tra aziende la famiglia — mai il testo, mai il motivo specifico. Il testo stesso è memorizzato in forma cifrata, non viene mai condiviso con un'altra azienda e viaggia solo tramite HTTPS.
  • Conta solo ciò che mette a rischio denaro o credito. Una richiesta entra nei modelli di frode solo se sono in gioco denaro o credito. Una firma dal notaio, un mutuo, un'assicurazione, le utenze, un impiego o le cure mediche vengono registrati ma non contano mai: chi firma un atto dal notaio e un mese dopo finanzia un telefono non viene segnalato.
  • I motivi sensibili non vengono mai condivisi. Salute, questioni legali, immigrazione, gioco d'azzardo, difficoltà con i debiti, incontri, religione o donazioni, decesso o successione e beni soggetti a limiti di età sono memorizzati come «Altro».
  • Sia concreto. Un motivo come KYC o verification non dice cosa sta acquistando la persona. Per impostazione predefinita la richiesta viene comunque creata, con un avviso. Se la Sua organizzazione ha attivato Rifiuta i motivi vaghi (Impostazioni → Prevenzione delle frodi → Regole della rete antifrode), viene invece rifiutata con 422.
  • Non inserisca dati personali. Indirizzi e-mail, numeri di telefono, di carta e di documento e date vengono rimossi prima che un'IA legga il motivo — non li scriva.

La risposta di creazione indica come è stato interpretato il motivo:

CampoValoriSignificato
purposeQualityinformativeIl motivo dice cosa viene acquistato, finanziato o aperto.
genericTroppo vago per essere classificato con precisione.
unusableNon è stato possibile comprenderlo.
warnings (solo se pertinente)purpose_too_generic · purpose_unusable · purpose_contains_personal_dataCosa correggere nel motivo. L'ultimo indica che sono stati trovati e rimossi dati personali.

Gli stessi campi sono restituiti da POST /api/v1/kyc/forms/:formId/send. Per un quadro completo, consulti Rete antifrode.

Il motivo viene scelto in quest'ordine: il purpose che invia, poi la motivazione predefinita del modulo (si imposta nell'editor dei moduli), poi «New customer verification», sempre memorizzato in inglese con esattamente questo testo. Le integrazioni che non inviano alcun motivo, come i plugin di firma elettronica, non ricevono quindi mai un errore. La motivazione predefinita non viene mai rifiutata (nemmeno con Rifiuta i motivi vaghi), non genera alcun avviso e non comporta denaro a rischio, quindi non alimenta gli schemi della rete antifrode.

Risposta (201)

{
  "id": "req_01J...",
  "status": "PENDING_UPLOAD",
  "type": "INDIVIDUAL",
  "externalRef": "your-id-here",
  "subTenantName": "Acme Corp",
  "subTenantExternalId": "cust_8842",
  "pendingDocTypes": ["GOVERNMENT_ID", "SELFIE"],
  "purposeQuality": "informative",
  "applicant": { ... },
  "createdAt": "2026-05-27T10:00:00.000Z"
}

pendingDocTypes riflette le impostazioni KYC della Sua organizzazione: ciò che è richiesto dipende dall'attivazione del controllo di vivacità, della prova di residenza, ecc.

purposeQuality vale informative, generic o unusable. Quando il motivo richiede la Sua attenzione, viene aggiunto un array warnings con purpose_too_generic, purpose_unusable e/o purpose_contains_personal_data.

Errori

  • 400 VALIDATION_ERROR — il corpo non ha superato la validazione Zod. error.fields elenca ogni percorso non valido.
  • 403 FORBIDDEN — la chiave non ha kyc:write, oppure (error.reason = "form_not_allowed") la chiave è limitata a moduli specifici e la richiesta non ha formId oppure ne indica un altro.
  • 404 NOT_FOUND — formId non è un modulo della Sua organizzazione.
  • 409 CONFLICT — il Suo externalRef è già usato da un'altra richiesta di questa organizzazione. Usi un riferimento diverso oppure cerchi la richiesta esistente.
  • 422 — la Sua organizzazione rifiuta i motivi vaghi (Rifiuta i motivi vaghi) e purpose è troppo generico o inutilizzabile. Indichi cosa viene acquistato o finanziato. Restituito anche da POST /api/v1/kyc/forms/:formId/send.

Elenca le richieste

GET /api/v1/kyc/requests    Ambito: kyc:read

Parametri di query

ParametroTipoPredefinitoNote
statusenum—Filtra per PENDING_UPLOAD, PROCESSING, APPROVED, REJECTED, ESCALATED, CANCELLED
typeenum—INDIVIDUAL oppure BUSINESS
externalRefstringa—Filtro a corrispondenza esatta sulla Sua chiave esterna
subTenantExternalIdstringa—Modalità partner: restituisce solo le richieste associate a questo ID del cliente finale
searchstringa—Ricerca libera su nome e email del richiedente
pageintero1Numero di pagina a partire da 1
limitintero20Massimo 100

Risposta

{
  "data": [
    { "id": "req_...", "status": "APPROVED", "type": "INDIVIDUAL", "createdAt": "...", "applicant": {...} },
    ...
  ],
  "pagination": {
    "total": 248,
    "page": 1,
    "limit": 20,
    "pages": 13
  }
}

Usi il filtro externalRef per recuperare una richiesta quando conosce solo la Sua chiave esterna — non è necessario memorizzare l'ID req_… di Certivant se il Suo externalRef è univoco.


Ottieni una singola richiesta

GET /api/v1/kyc/requests/:id    Ambito: kyc:read

Restituisce la verifica completa — il richiedente, ogni documento caricato (con i campi estratti tramite OCR), ogni controllo automatico, il dettaglio completo del rischio, i segnali di frode e il registro di audit. È tutto ciò che mostra la schermata di dettaglio della dashboard, quindi può costruire una Sua interfaccia di revisione senza mai far accedere il personale a Certivant.

Risposta

{
  "id": "req_...",
  "status": "ESCALATED",
  "type": "INDIVIDUAL",
  "externalRef": "user-9281",
  "subTenantName": null,
  "subTenantExternalId": null,
  "reviewedBy": null,
  "reviewNote": null,
  "completedAt": null,
  "createdAt": "2026-05-27T10:00:00.000Z",
  "updatedAt": "2026-05-27T10:03:12.000Z",

  "applicant": {
    "id": "app_...",
    "fullName": "Alex Singh",
    "dateOfBirth": "1988-11-03T00:00:00.000Z",
    "nationality": "GBR",
    "email": "alex@example.com",
    "emailVerified": true,
    "phone": "+447700900100",
    "phoneVerified": false,
    "metadata": {}
  },

  "documents": [
    {
      "id": "doc_...",
      "documentType": "id_card",
      "side": "front",
      "status": "done",
      "mimeType": "image/jpeg",
      "fileSize": 412938,
      "parsedData": {
        "fullName": "Alex Singh",
        "dateOfBirth": "1988-11-03",
        "documentNumber": "D1234567",
        "expiryDate": "2030-01-15",
        "nationality": "GBR",
        "issuingCountry": "GBR",
        "address": "12 High St, London"
      },
      "createdAt": "2026-05-27T10:01:00.000Z"
    }
  ],

  "checks": [
    { "id": "chk_1", "checkType": "ocr",        "provider": "aws_textract", "status": "passed", "score": 0.95, "startedAt": "...", "finishedAt": "..." },
    { "id": "chk_2", "checkType": "face_match", "provider": "azure_face",   "status": "passed", "score": 0.88 },
    { "id": "chk_3", "checkType": "liveness",   "provider": "azure_face",   "status": "passed", "score": 0.92 },
    { "id": "chk_4", "checkType": "sanctions",  "provider": "ofac",         "status": "failed", "score": 0.0 }
  ],

  "riskScore": {
    "overallScore": 62,
    "decision": "escalate",
    "autoDecision": true,
    "factors": [
      { "factor": "document_authenticity", "impact": 1.0, "description": "Barcode + metadata valid" }
    ],
    "rejectionReasons": [],
    "verdictMeta": {
      "factorVerdicts": [
        { "id": "1.1", "section": "Identity Document", "label": "Document authenticity", "weight": 15, "state": "pass", "evidence": ["barcode_valid"] },
        { "id": "4.2", "section": "Screening",         "label": "Sanctions / PEP",       "weight": 20, "state": "fail", "evidence": ["ofac_possible_match"] }
      ],
      "disqualifiers": [],
      "reviewTriggers": ["sanctions_possible_match"],
      "effectiveThresholdApprove": 80
    }
  },

  "fraudSignals": [
    { "signalType": "device_reuse", "severity": "low", "details": { "matchedFingerprint": "..." } }
  ],

  "auditLogs": [
    { "id": "log_1", "actorType": "api",    "actorId": "kyk_prod_ab",  "eventType": "request.created",   "payload": {}, "createdAt": "..." },
    { "id": "log_2", "actorType": "system", "actorId": "orchestrator", "eventType": "request.escalated", "payload": { "reason": "sanctions" }, "createdAt": "..." }
  ]
}

Riferimento dei campi

PercorsoNote
documents[].parsedDataCampi estratti tramite OCR (variano in base al tipo di documento): fullName, dateOfBirth, documentNumber, expiryDate, nationality, issuingCountry, address. null finché l'OCR non viene eseguito
documents[].statuspending · processing · done · failed
checks[].checkTypeocr · face_match · liveness · sanctions · llm_consistency
checks[].statuspending · running · passed · failed · skipped · error
checks[].score0.0–1.0 (null per i controlli solo di superamento/fallimento). details contiene il risultato grezzo del fornitore
riskScore.overallScorePunteggio composito 0–100
riskScore.decisionapprove · reject · escalate. autoDecision: false = una persona ha sovrascritto la decisione
riskScore.verdictMeta.factorVerdicts[]La matrice PASS/FAIL/N.D. che spiega perché la decisione è stata presa — state è pass · fail · n/a
riskScore.verdictMeta.disqualifiersCodici di primo livello che impongono un rifiuto
riskScore.verdictMeta.reviewTriggersCodici di secondo livello che impongono l'inoltro
fraudSignals[]signalType (same_face · velocity · document_reuse · device_reuse), severity (low · medium · high)
auditLogs[]Cronologia a prova di manomissione; actorType è api · system · user

Errori

  • 404 NOT_FOUND — nessuna richiesta con quell'ID in questa organizzazione. Le richieste appartengono alle organizzazioni: non può leggere i dati di un'altra organizzazione nemmeno con una chiave valida.

Mostrare una verifica nella propria app

La risposta di dettaglio è pensata per essere visualizzata direttamente — una sola chiamata fornisce tutto ciò che mostra la dashboard, così i Suoi revisori non devono mai accedere a Certivant:

GET /api/v1/kyc/requests/:id → dati del richiedente, documents[].parsedData, checks[] e riskScore.verdictMeta.

Per ogni documento, GET /api/v1/kyc/requests/:id/documents/:docId/url → un URL firmato valido per 15 minuti. Visualizzi le immagini con <img src> e i PDF con <iframe> — l'URL è prefirmato e non richiede l'intestazione Authorization. Vedi Documenti → Ottenere un URL di download.

Mostri checks[] (superato/fallito + punteggio) e riskScore.verdictMeta.factorVerdicts[] affinché il revisore veda esattamente perché una richiesta è stata inoltrata, quindi agisca con POST /requests/:id/decision.

Recuperi gli URL dei documenti al momento, appena prima di visualizzarli. Scadono dopo 15 minuti e non devono mai essere registrati, memorizzati nella cache o esposti a utenti non autenticati.


Invia per l'elaborazione

POST /api/v1/kyc/requests/:id/submit    Ambito: kyc:submit

Immette una richiesta PENDING_UPLOAD nella pipeline di elaborazione automatica. La richiesta deve avere tutti i documenti obbligatori caricati (pendingDocTypes è vuoto) prima di poter essere inviata.

Se la Sua organizzazione richiede la verifica dell'email e/o del telefono (Impostazioni KYC/B), assicuri che ogni canale richiesto sia verificato prima dell'invio — imposti applicant.emailVerified / applicant.phoneVerified: true alla creazione (quando li ha validati Lei stesso) oppure faccia completare al richiedente il passaggio del codice in una sessione ospitata. Un canale obbligatorio non verificato fa fallire il controllo di verifica dei contatti durante l'elaborazione.

Risposta

{
  "id": "req_...",
  "status": "PROCESSING",
  "message": "Request submitted; you will receive a webhook when processing completes."
}

Errori

  • 400 BAD_REQUEST — pendingDocTypes non è vuoto. Carichi prima i documenti mancanti.
  • 409 CONFLICT — la richiesta non è in PENDING_UPLOAD. È possibile inviarla una sola volta.

Decisione manuale (richieste inoltrate)

POST /api/v1/kyc/requests/:id/decision    Ambito: kyc:manage

Sovrascrive una richiesta ESCALATED con una decisione umana. Questo endpoint è pensato per gli strumenti interni — la maggior parte delle decisioni viene presa tramite la dashboard.

Corpo della richiesta

{ "decision": "APPROVED", "note": "Confirmed identity against internal CRM record" }
CampoTipoObbligatorioNote
decisionenumsìAPPROVED oppure REJECTED
notestringasìDa 1 a 1000 caratteri. Salvata nel registro di audit; visibile a tutti i revisori

Risposta

{ "id": "req_...", "status": "APPROVED", "decision": "APPROVED", "reviewNote": "..." }

Errori

  • 409 CONFLICT — la richiesta non è nello stato ESCALATED. Non si può sovrascrivere un'approvazione automatica.

Reinvia una richiesta rifiutata

POST /api/v1/kyc/requests/:id/resubmit    Ambito: kyc:write

Riporta una richiesta REJECTED allo stato PENDING_UPLOAD, in modo che il richiedente possa riprovare. I documenti precedenti vengono cancellati; il richiedente ne carica di nuovi.

Risposta

{ "id": "req_...", "status": "PENDING_UPLOAD" }

Errori

  • 409 CONFLICT — la richiesta non è nello stato REJECTED. Si possono reinviare solo le richieste rifiutate; quelle annullate o approvate no.

Il reinvio è un'operazione privilegiata. Assicuri che la politica della Sua organizzazione consenta al richiedente di riprovare. Alcuni flussi regolamentati richiedono una nuova richiesta anziché un reinvio, affinché il registro di audit mostri chiaramente tentativi separati.


Elimina una richiesta

DELETE /api/v1/kyc/requests/:id    Ambito: kyc:write

Elimina in modo permanente la richiesta e tutto ciò che vi è collegato: la cancellazione coinvolge a cascata documenti, controlli e punteggi di rischio della richiesta, rimuove dallo storage le immagini/i PDF dei documenti caricati, ed elimina il record del richiedente quando nessun'altra richiesta vi fa riferimento. Usi questa operazione per soddisfare la richiesta di cancellazione di un cliente o per eliminare una verifica di prova.

Risposta

{
  "success": true,
  "documentsDeleted": 3,
  "applicantDeleted": true
}
  • documentsDeleted — quanti file memorizzati sono stati rimossi.
  • applicantDeleted — se il richiedente è stato ripulito perché orfano (false se ha ancora altre richieste).

Errori

  • 404 NOT_FOUND — nessuna richiesta con quell'ID nella Sua organizzazione.

L'operazione è irreversibile — i documenti caricati non ci sono più. Il registro di audit, in sola aggiunta, viene conservato (le sue righe sono un riferimento indipendente), quindi la traccia del fatto che una richiesta è esistita ed è stata eliminata sopravvive ai fini di conformità. Se vuole solo cancellare i dati personali del richiedente, usi invece Elimina un richiedente.


Comunicare l'esito

POST /api/v1/kyc/requests/:id/outcome    Ambito: kyc:write

Facoltativo. Comunichi a Certivant se l'acquisto o il credito per cui è stata fatta la verifica è stato davvero consegnato o annullato. Lo chiami quando la richiesta è stata decisa.

Corpo della richiesta

{ "fulfilled": true }
CampoTipoObbligatorioNote
fulfilledbooleanosìtrue = l'acquisto o il credito è stato consegnato. false = è stato annullato

Risposta

{ "id": "req_...", "fulfilled": true, "recorded": true }

recorded: false significa che la richiesta non è ancora nella rete antifrode (ad esempio perché non ha chiavi di identità). Non si perde nulla: può inviare l'esito più tardi. Può anche richiamare l'endpoint in qualsiasi momento per modificare la risposta.

Errori

  • 404 NOT_FOUND — nessuna richiesta con questo id in questa organizzazione.
  • 409 CONFLICT — la richiesta non è ancora stata decisa. Il suo stato deve essere APPROVED, REJECTED, ESCALATED o PENDING_SECOND_REVIEW.

Perché è utile. Nella rete antifrode un acquisto consegnato conta per intero, mentre uno annullato non conta affatto. Un cliente che ha avviato tre finanziamenti di telefoni e ne ha annullati due non viene quindi scambiato per qualcuno che se ne è andato con tre telefoni. Viene condiviso solo l'esito: nient'altro lascia la Sua organizzazione.


Ottieni i segnali di frode

GET /api/v1/kyc/requests/:id/fraud-signals    Ambito: kyc:read

Restituisce i segnali di frode legati al dispositivo, alla rete e al comportamento raccolti durante la verifica.

Risposta

[
  {
    "signalType": "device_reused",
    "severity": "medium",
    "details": { "previousRequestIds": ["req_..."], "matchedFingerprint": "..." }
  },
  {
    "signalType": "vpn_detected",
    "severity": "low",
    "details": { "asn": 13335, "isp": "Cloudflare" }
  }
]

La gravità è low, medium oppure high. I segnali di gravità alta inoltrano automaticamente la richiesta a una revisione manuale.


Monitoraggio AML continuo

Una verifica approvata può essere ricontrollata alla ricerca di nuovi riscontri in liste sanzioni, PEP (persone politicamente esposte) e notizie negative (adverse media) (vedi Monitoraggio continuo). Il monitoraggio è una funzione del piano e viene fatturato per persona monitorata all'anno.

ChiamataAmbitoEffetto
GET /api/v1/kyc/requests/:id/monitoringkyc:readStato: enrolled, status (active, paused, cancelled), frequency, enrolledAt, lastScreenedAt, nextScreenAt, nextBillingAt, openAlerts
POST /api/v1/kyc/requests/:id/monitoringkyc:manageAvvia il monitoraggio. Corpo { "frequency": "daily" | "weekly" | "monthly" } (predefinito monthly). Restituisce { "success": true, "frequency": "monthly", "chargedCents": 0 }
DELETE /api/v1/kyc/requests/:id/monitoringkyc:manageInterrompe il monitoraggio

POST restituisce 409 per una verifica non approvata, 403 quando il piano non include il monitoraggio e 402 quando non c'è credito per una persona oltre la quota inclusa.

I nuovi riscontri arrivano come webhook kyc.monitoring.alert (vedi Eventi webhook): data.monitoring contiene alertType (sanctions_match, pep_match, adverse_media, sanctions_unverifiable), severity e, per un PEP, pepTier — 1 capi di stato e ministri … 4 familiari e stretti collaboratori — oppure adverseMedia: true. data.sanctions.listsChecked indica le liste controllate; i fornitori dei servizi di screening non vengono mai nominati.

La verifica stessa riporta gli stessi pepTier / adverseMedia in data.sanctions nel webhook della decisione.


Elimina un richiedente (cancellazione GDPR)

DELETE /api/v1/kyc/applicants/:applicantId    Ambito: kyc:manage

Elimina in modo permanente un richiedente e ogni richiesta a lui collegata. È l'endpoint per il diritto alla cancellazione previsto dall'articolo 17 del GDPR. Il registro di audit conserva un segnaposto (tombstone) con la data e l'ora della cancellazione, ma nessun dato personale.

Risposta

{ "success": true, "deletedRequestIds": ["req_...", "req_..."] }

La cancellazione è irreversibile. Si consulti con il Suo team di conformità prima di chiamare questo endpoint — a seconda della giurisdizione, potrebbe avere l'obbligo normativo di conservare le registrazioni di verifica per 5–7 anni, in contrasto con la cancellazione.