Webhooks KYC update (notif 53 / 54)¶
Lemonway notifie l'ouverture et le cycle d'un KYC update (recertif) sur un compte déjà ACCEPTED. Distinct des webhooks onboarding v2 account-status-changed / profile-status-changed (Lemonway — Webhooks) : le profile LENDER ne change pas.
Mapping identité Bricks : Recertif KYC Lemonway.
Source : kyc-update-webhook.controller.ts.
Matching : customers.lemonway.account.id / SPV.json.lemonway.account.id (onboarding v2).
- Investor v2 →
onboardingStatusChangedHook→syncInvestorKycStatus. - SPV v2 → même hook (sync KYB) et alerte Slack OPS (
#lemonway-kyc-recertif-webhook-updates) : pas d'UI recertif, traitement manuel. - Chaque webhook 53/54 enqueue le job Graphile
migrate-lemonway-onboarding-v1-to-v2payload{ lwAccountId, source: 'recertif' }, sansqueueName, priority par défaut0(jobs concurrents,jobKey…-{AccountID}-recertif,maxAttempts: 3) — y compris si un customer/SPV v2 matche déjà (account.id). Le job est idempotent (already-v2-*) et rattrape un v1 restant. Il ne resync pas le KYC desalready-v2-investor(le webhook l'a déjà fait), sauf retry Graphile après un échec KYC du job. Match v2 → aussionboardingStatusChangedHook(ids déjà lus) + Slack recertif SPV. - Lookups JSONB (
customers.lemonway/SPV.json.lemonway:account.id,wallet.externalId) : indexCREATE INDEX CONCURRENTLYmanuel à jouer en prod avant le merge, pas Flyway. Soft-deleted customers inclus. - Job GET
/accounts/{id}sans type (API v3, timeout axios :lemonway-account-get-error→ retry Graphile). JambeLENDER: chaque wallet →customers(JSONB uniquement). JambePROJECT_HOLDER: chaque wallet → SPV (JSONB + dual-write). Les deux jambes tournent indépendamment. - Plusieurs customers / wallets LENDER distincts sur le même account : chacun passe v2 (même
account.id, chacun son wallet) puissyncInvestorKycStatus. Wallet LENDER partagé (multiple-investors-for-wallet) : Slack#suivi-lemonway-migration-v1-to-v2, sans retry. customerTypevsaccount.type(individual↔INDIVIDUAL,business↔LEGAL_ENTITY) : mismatch → pas d'écriture JSONB, Slack:x:investor-onboarding-account-type-mismatch, sans retry. Les autres wallets du même GET continuent (SPV y compris).- Wallet LENDER sans investor, wallet PROJECT_HOLDER sans SPV, ou compte sans wallet : info Slack
#suivi-lemonway-migration-v1-to-v2(pas de retry). Sourcemanual(script Excel et BO Technique) : ces infos sont coupées. - Slack suivi (
#suivi-lemonway-migration-v1-to-v2: unused, unmatched, échecs LENDER / PROJECT_HOLDER) : premier essai Graphile qui a réussi le GET, ou retry dontlast_errorestlemonway-account-get-error. Sourcemanual: échecs seulement (LENDER / PROJECT_HOLDER, GET, KYC sync), pas les wallets inutilisés. Échec GET / KYC sync retryable : Slack au dernier essai. Recertif OPS : le jobsource: 'recertif'alerte surmigrated-spvetalready-v2-spv(un job manual peut avoir migré le SPV avant). Le webhook a déjà alerté si le SPV était v2 à la réception : double alerte acceptée. - Échec PROJECT_HOLDER : les autres SPV sont migrés, Slack premier essai, alerte recertif OPS pour les SPV nouvellement migrés. Pas de retry Graphile (Slack seulement, comme LENDER).
- Plusieurs SPV / wallets PROJECT_HOLDER distincts sur le même account Lemonway (1 account → N SPV, N wallets sur le même profile
PROJECT_HOLDER) : chacun passe v2, dual-writeupsertle mêmelemonway_account+ le profile unique. - Recertif SPV : alerte OPS si le webhook matche déjà un SPV v2, ou si le job recertif voit un SPV migré ou déjà v2. Source
manual(script Excelenqueue-lemonway-onboarding-v1-to-v2.script.tset BO TechniquePOST /administration/lemonway-onboarding/v1-to-v2, body{ lwAccountIds }, un job par compte dans la même transaction) : priority Graphile10,jobKey…-{AccountID}-manual.replacerelance le même compte (script ou BO) sans écraser un recertif en queue. Pas d'alerte recertif, pas d'info Slack wallet inutilisé. Customers soft-deleted inclus. Le job reste idempotent (already-v2-*). Le script fait unadd_jobparky_safePgTransaction(dry-run = rollback de cet insert, concurrencep-limit).
Pas de Slack à réception : les 53/54 sont loggés. Slack OPS uniquement pour une recertif SPV.
POST /lemonway/account/requirement-change¶
Notification Lemonway 53 — changement de requirement (KYC_UPDATE : REQUESTED / UNDER_ANALYSIS / REJECTED / ACCEPTED / OVERDUE).
Query params¶
apiKey— requis si configuré
Request body¶
Le payload complet est passé au hook (sync). dueDate Bricks vient du GET /accounts (isoDate), pas du DueDate calendaire du webhook.
Response¶
Pas de body.
Erreurs¶
| Code | Statut | Cause |
|---|---|---|
UnauthorizedException |
401 | API key manquante / invalide |
| validation | 400 | AccountID absent / invalide |
POST /lemonway/account/restriction-change¶
Notification Lemonway 54 — restriction KYC_OUTDATED posée ou levée. Même contrat que requirement-change.
Liens¶
- Service :
kyc-update-webhook.service.ts - Job migration v1 → v2 :
migrate-lemonway-onboarding-v1-to-v2.task.ts - Recertif : kyc-recertif.md