Aller au contenu

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-v2 payload { lwAccountId, source: 'recertif' }, sans queueName, priority par défaut 0 (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 des already-v2-investor (le webhook l'a déjà fait), sauf retry Graphile après un échec KYC du job. Match v2 → aussi onboardingStatusChangedHook (ids déjà lus) + Slack recertif SPV.
  • Lookups JSONB (customers.lemonway / SPV.json.lemonway : account.id, wallet.externalId) : index CREATE INDEX CONCURRENTLY manuel à 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). Jambe LENDER : chaque wallet → customers (JSONB uniquement). Jambe PROJECT_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) puis syncInvestorKycStatus. Wallet LENDER partagé (multiple-investors-for-wallet) : Slack #suivi-lemonway-migration-v1-to-v2, sans retry.
  • customerType vs account.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). Source manual (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 dont last_error est lemonway-account-get-error. Source manual : é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 job source: 'recertif' alerte sur migrated-spv et already-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-write upsert le même lemonway_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 Excel enqueue-lemonway-onboarding-v1-to-v2.script.ts et BO Technique POST /administration/lemonway-onboarding/v1-to-v2, body { lwAccountIds }, un job par compte dans la même transaction) : priority Graphile 10, jobKey …-{AccountID}-manual. replace relance 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 un add_job par ky_safePgTransaction (dry-run = rollback de cet insert, concurrence p-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

{
  "AccountID": "uuid-lemonway-account-id"
}

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