vesant-sdk 1.7.0-dev.fce9898 → 1.7.0-dev.fe84882

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/dist/{client-DoMSYMMR.d.ts → client-0NOPDnT0.d.ts} +29 -26
  2. package/dist/{client-DMIRx7Tu.d.mts → client-CvWNRwwg.d.mts} +29 -26
  3. package/dist/{client-ZNdnpWe7.d.mts → client-Dps40EtF.d.mts} +2 -2
  4. package/dist/{client-C3DCmGe9.d.ts → client-SMxqod4j.d.ts} +2 -2
  5. package/dist/{client-BolQlL5e.d.mts → client-q9fN8Hhf.d.mts} +103 -1
  6. package/dist/{client-BolQlL5e.d.ts → client-q9fN8Hhf.d.ts} +103 -1
  7. package/dist/compliance/index.d.mts +3 -3
  8. package/dist/compliance/index.d.ts +3 -3
  9. package/dist/compliance/index.js +133 -22
  10. package/dist/compliance/index.js.map +1 -1
  11. package/dist/compliance/index.mjs +133 -22
  12. package/dist/compliance/index.mjs.map +1 -1
  13. package/dist/decisions/index.d.mts +1 -1
  14. package/dist/decisions/index.d.ts +1 -1
  15. package/dist/decisions/index.js +68 -7
  16. package/dist/decisions/index.js.map +1 -1
  17. package/dist/decisions/index.mjs +68 -7
  18. package/dist/decisions/index.mjs.map +1 -1
  19. package/dist/geolocation/index.d.mts +59 -4
  20. package/dist/geolocation/index.d.ts +59 -4
  21. package/dist/geolocation/index.js +136 -19
  22. package/dist/geolocation/index.js.map +1 -1
  23. package/dist/geolocation/index.mjs +134 -20
  24. package/dist/geolocation/index.mjs.map +1 -1
  25. package/dist/index-C3zUKydT.d.mts +264 -0
  26. package/dist/index-DSDgS09k.d.ts +264 -0
  27. package/dist/index.d.mts +26 -9
  28. package/dist/index.d.ts +26 -9
  29. package/dist/index.js +324 -57
  30. package/dist/index.js.map +1 -1
  31. package/dist/index.mjs +317 -58
  32. package/dist/index.mjs.map +1 -1
  33. package/dist/kyc/core.d.mts +2 -2
  34. package/dist/kyc/core.d.ts +2 -2
  35. package/dist/kyc/core.js +94 -19
  36. package/dist/kyc/core.js.map +1 -1
  37. package/dist/kyc/core.mjs +94 -19
  38. package/dist/kyc/core.mjs.map +1 -1
  39. package/dist/kyc/index.d.mts +90 -13
  40. package/dist/kyc/index.d.ts +90 -13
  41. package/dist/kyc/index.js +94 -19
  42. package/dist/kyc/index.js.map +1 -1
  43. package/dist/kyc/index.mjs +94 -19
  44. package/dist/kyc/index.mjs.map +1 -1
  45. package/dist/react.d.mts +9 -3
  46. package/dist/react.d.ts +9 -3
  47. package/dist/react.js +180 -77
  48. package/dist/react.js.map +1 -1
  49. package/dist/react.mjs +180 -77
  50. package/dist/react.mjs.map +1 -1
  51. package/dist/risk-profile/index.d.mts +1 -1
  52. package/dist/risk-profile/index.d.ts +1 -1
  53. package/dist/risk-profile/index.js +68 -7
  54. package/dist/risk-profile/index.js.map +1 -1
  55. package/dist/risk-profile/index.mjs +68 -7
  56. package/dist/risk-profile/index.mjs.map +1 -1
  57. package/dist/scores/index.d.mts +1 -1
  58. package/dist/scores/index.d.ts +1 -1
  59. package/dist/scores/index.js +68 -7
  60. package/dist/scores/index.js.map +1 -1
  61. package/dist/scores/index.mjs +68 -7
  62. package/dist/scores/index.mjs.map +1 -1
  63. package/dist/tax/index.d.mts +2 -2
  64. package/dist/tax/index.d.ts +2 -2
  65. package/dist/tax/index.js +73 -9
  66. package/dist/tax/index.js.map +1 -1
  67. package/dist/tax/index.mjs +73 -9
  68. package/dist/tax/index.mjs.map +1 -1
  69. package/dist/webhooks/index.d.mts +2 -189
  70. package/dist/webhooks/index.d.ts +2 -189
  71. package/dist/webhooks/index.js +85 -21
  72. package/dist/webhooks/index.js.map +1 -1
  73. package/dist/webhooks/index.mjs +85 -22
  74. package/dist/webhooks/index.mjs.map +1 -1
  75. package/package.json +4 -1
@@ -1,6 +1,6 @@
1
1
  import { P as ProfileFilters, b as ProfileListResponse, C as CustomerProfile, a as CreateProfileRequest } from '../types-BOFaMQxI.mjs';
2
2
  import { c as Reason, R as RiskLevel, P as PaginationParams } from '../types-CBQRNL-l.mjs';
3
- import { B as BaseClient } from '../client-BolQlL5e.mjs';
3
+ import { B as BaseClient, R as RequestOptions } from '../client-q9fN8Hhf.mjs';
4
4
 
5
5
  /**
6
6
  * TypeScript type definitions for Vesant KYC Service API
@@ -318,8 +318,49 @@ interface RequestKycSubmitLinkRequest {
318
318
  redirect_url?: string;
319
319
  /** URL to receive callback notifications via POST request when KYC status changes (optional) */
320
320
  callback_url?: string;
321
- /** Event that triggered the KYC request (e.g. "onboarding", "login", "transaction") */
321
+ /**
322
+ * Event that triggered the KYC request. Valid values: "onboarding",
323
+ * "first_withdrawal", "first_purchase", "manual". The tenant's KYC
324
+ * verification trigger preferences decide, per event, whether KYC is
325
+ * required (`kyc_required` in the response). "manual" always requires
326
+ * KYC and honors the tenant's allow-skip-on-manual option (`can_skip`).
327
+ * Omitted or unknown values default to KYC required with no skip.
328
+ */
322
329
  trigger_event?: string;
330
+ /**
331
+ * Registered customer identity data (optional). Seeds the customer's risk
332
+ * profile so document verification can cross-check the submitted document
333
+ * against trusted reference data (name/DOB match, address verification).
334
+ * Fields never overwrite data already on the profile.
335
+ */
336
+ customer_data?: KycCustomerData;
337
+ }
338
+ /**
339
+ * Customer identity data supplied by your platform on a submit-link request.
340
+ * Mirrors the geolocation `customer_data` contract. Every field is optional
341
+ * and never overwrites data already on the customer's risk profile.
342
+ */
343
+ interface KycCustomerData {
344
+ /**
345
+ * Customer's registered full name. Used to match the OCR-extracted name
346
+ * on the submitted document.
347
+ */
348
+ full_name?: string;
349
+ /**
350
+ * Customer's registered date of birth. ISO 8601 date ("1999-06-02") or an
351
+ * RFC 3339 timestamp ("1986-09-06T18:30:00.000+00:00", as produced by
352
+ * `Date.prototype.toISOString()`) — for timestamps the date portion is
353
+ * used. Used for DOB matching against the submitted document.
354
+ */
355
+ date_of_birth?: string;
356
+ /** Customer's email address */
357
+ email?: string;
358
+ /** Customer's phone number */
359
+ phone?: string;
360
+ /** Customer's residential address. Used for address verification. */
361
+ address?: string;
362
+ /** Customer's country of residence */
363
+ country?: string;
323
364
  }
324
365
  /**
325
366
  * Trigger events that can request Event-Based Face Verification.
@@ -374,12 +415,34 @@ interface SubmitEventBasedFaceVerificationSessionRequest {
374
415
  proof: string;
375
416
  /** Unique reference for the KYC session (e.g., customer ID or transaction ID) */
376
417
  reference?: string;
418
+ /**
419
+ * Optional capture telemetry (JSON string): the face-detection
420
+ * bounding-box samples recorded in the moments before capture. Attached
421
+ * automatically by `FaceCaptureModal` when in-modal detection is active;
422
+ * omit when building a custom capture UI without detection. Stored
423
+ * verbatim server-side for audit/review — a weak presence signal, not
424
+ * certified anti-spoofing.
425
+ */
426
+ liveness_artifact?: string;
377
427
  }
378
428
  interface RequestKycSubmitLinkResponse {
379
429
  /** Generated KYC submission redirect URL */
380
430
  link: string;
381
431
  /** KYC request ID */
382
432
  kyc_id: string;
433
+ /**
434
+ * Whether KYC is required for the reported `trigger_event`, per the
435
+ * tenant's verification trigger preferences. `false` when the trigger
436
+ * is disabled for the tenant, or when the customer is already verified
437
+ * (in that case `link` and `kyc_id` are empty).
438
+ */
439
+ kyc_required: boolean;
440
+ /**
441
+ * Whether the user may skip verification. Only `true` for
442
+ * `trigger_event: "manual"` when the tenant enables allow-skip-on-manual,
443
+ * or when the customer is already verified.
444
+ */
445
+ can_skip: boolean;
383
446
  }
384
447
  /** Device class detected by the SDK (purely client-side — server doesn't care). */
385
448
  type EventBasedFaceVerificationDeviceType = 'mobile' | 'desktop';
@@ -657,7 +720,7 @@ interface UseKycPreferencesResult extends BaseHookState {
657
720
  */
658
721
  declare class KycClient extends BaseClient {
659
722
  private userId?;
660
- private riskProfileBaseURL?;
723
+ private readonly riskProfileBaseURL?;
661
724
  constructor(config: KycClientConfig);
662
725
  /**
663
726
  * Set the user ID for operations requiring user context
@@ -676,7 +739,13 @@ declare class KycClient extends BaseClient {
676
739
  *
677
740
  * Generates a link that the user can visit to submit their KYC documents.
678
741
  *
679
- * @param request - Request containing the user ID, optional redirect URL, and optional callback URL (receives POST requests)
742
+ * Optionally pass the customer's registered identity data as
743
+ * `customer_data` (same shape as the geolocation `customer_data` block).
744
+ * It seeds the customer's risk profile so document verification can
745
+ * cross-check the submitted document against trusted reference data;
746
+ * fields never overwrite data already on the profile.
747
+ *
748
+ * @param request - Request containing the user ID, optional redirect URL, optional callback URL (receives POST requests), and optional customer identity data
680
749
  * @returns Response containing the redirect link and KYC ID
681
750
  *
682
751
  * @example
@@ -684,14 +753,22 @@ declare class KycClient extends BaseClient {
684
753
  * const result = await client.requestKycSubmitLink({
685
754
  * user_id: "user_123",
686
755
  * redirect_url: "https://merchant.com/kyc-complete", // optional
687
- * callback_url: "https://merchant.com/api/kyc-webhook" // optional - receives POST requests on status change
756
+ * callback_url: "https://merchant.com/api/kyc-webhook", // optional - receives POST requests on status change
757
+ * customer_data: { // optional - seeds the risk profile for document cross-checks
758
+ * full_name: "John Doe",
759
+ * date_of_birth: "1999-06-02", // ISO 8601
760
+ * email: "john@example.com",
761
+ * phone: "+94771234567",
762
+ * address: "12 Main St, Colombo", // used for address verification
763
+ * country: "LK"
764
+ * }
688
765
  * });
689
766
  *
690
767
  * console.log(`Redirect user to: ${result.link}`);
691
768
  * console.log(`KYC ID: ${result.kyc_id}`);
692
769
  * ```
693
770
  */
694
- requestKycSubmitLink(request: RequestKycSubmitLinkRequest): Promise<RequestKycSubmitLinkResponse>;
771
+ requestKycSubmitLink(request: RequestKycSubmitLinkRequest, requestOptions?: RequestOptions): Promise<RequestKycSubmitLinkResponse>;
695
772
  /**
696
773
  * Create a Event-Based Face Verification session.
697
774
  *
@@ -717,7 +794,7 @@ declare class KycClient extends BaseClient {
717
794
  *
718
795
  * @param request - Token from `createEventBasedFaceVerificationSession`, plus the base64 selfie.
719
796
  */
720
- submitEventBasedFaceVerificationSession(request: SubmitEventBasedFaceVerificationSessionRequest): Promise<EventBasedFaceVerificationCallback>;
797
+ submitEventBasedFaceVerificationSession(request: SubmitEventBasedFaceVerificationSessionRequest, requestOptions?: RequestOptions): Promise<EventBasedFaceVerificationCallback>;
721
798
  /**
722
799
  * Look up the current state of a Event-Based Face Verification session by its
723
800
  * session token. Useful for desktop pollers waiting on the mobile handoff.
@@ -789,7 +866,7 @@ declare class KycClient extends BaseClient {
789
866
  * @example
790
867
  * ```typescript
791
868
  * const result = await client.submitVerification({
792
- * reference: "customer_123",
869
+ * reference: "4d2aff34-ab86-422d-992e-50b1234a5b67",
793
870
  * email: "customer@example.com",
794
871
  * country: "US",
795
872
  * document: {
@@ -806,7 +883,7 @@ declare class KycClient extends BaseClient {
806
883
  * console.log(`Verification submitted: ${result.reference}`);
807
884
  * ```
808
885
  */
809
- submitVerification(request: DocumentVerificationRequest): Promise<DocumentVerificationResponse>;
886
+ submitVerification(request: DocumentVerificationRequest, requestOptions?: RequestOptions): Promise<DocumentVerificationResponse>;
810
887
  /**
811
888
  * Get a KYC request by ID
812
889
  *
@@ -815,7 +892,7 @@ declare class KycClient extends BaseClient {
815
892
  *
816
893
  * @example
817
894
  * ```typescript
818
- * const kyc = await client.getKycRequest("kyc_abc123");
895
+ * const kyc = await client.getKycRequest("550e8400-e29b-41d4-a716-446655440000");
819
896
  * console.log(`Status: ${kyc.status}, ID Verified: ${kyc.id_verified}`);
820
897
  * ```
821
898
  */
@@ -868,7 +945,7 @@ declare class KycClient extends BaseClient {
868
945
  * @example
869
946
  * ```typescript
870
947
  * await client.requestAdditionalDocuments({
871
- * id: "kyc_abc123",
948
+ * id: "550e8400-e29b-41d4-a716-446655440000",
872
949
  * document_types: ["address", "document_two"],
873
950
  * message: "Please provide proof of address and secondary ID"
874
951
  * });
@@ -883,7 +960,7 @@ declare class KycClient extends BaseClient {
883
960
  *
884
961
  * @example
885
962
  * ```typescript
886
- * const proofs = await client.getProofDownloadURLs("kyc_abc123");
963
+ * const proofs = await client.getProofDownloadURLs("550e8400-e29b-41d4-a716-446655440000");
887
964
  * proofs.forEach(proof => {
888
965
  * console.log(`${proof.type}: ${proof.url} (expires: ${proof.expires_at})`);
889
966
  * });
@@ -1069,4 +1146,4 @@ declare class KycClient extends BaseClient {
1069
1146
  createCustomerProfile(profile: CreateProfileRequest): Promise<CustomerProfile>;
1070
1147
  }
1071
1148
 
1072
- export { type CheckKycStatusRequest, type CheckKycStatusResponse, CreateProfileRequest as CreateCustomerProfileRequest, type CreateEventBasedFaceVerificationSessionRequest, type CreateEventBasedFaceVerificationSessionResponse, CustomerProfile, ProfileFilters as CustomerProfileFilters, ProfileListResponse as CustomerProfileListResponse, type DocumentType, type DocumentVerificationRequest, type DocumentVerificationResponse, type EventBasedFaceVerificationCallback, type EventBasedFaceVerificationDeviceType, type EventBasedFaceVerificationEvent, type EventBasedFaceVerificationFrequencyTrigger, type EventBasedFaceVerificationReactionResult, type EventBasedFaceVerificationReactions, type EventBasedFaceVerificationThresholdTrigger, type EventBasedFaceVerificationTriggers, type FaceProof, KYC_DECLINED_DESCRIPTIONS, type KycAlert, type KycAlertFilters, type KycAlertListResponse, type KycAlertStatus, type KycAlertType, KycClient, type KycClientConfig, type KycCustomerProfile, type KycDeclinedCode, type KycHandoffSession, type KycOverview, type KycPagination, type KycPreferences, type KycRequest, type KycRequestFilters, type KycRequestListResponse, type KycStatus, type Name, PaginationParams, type Proof, type ProofDownloadURL, type ProofType, type RequestAdditionalDocumentsRequest, type RequestKycSubmitLinkRequest, type RequestKycSubmitLinkResponse, RiskLevel, type SubmitEventBasedFaceVerificationSessionRequest, type SubmittedDocument, type SupportedDocumentType, type UpdateKycAlertRequest, type UpdateKycPreferencesRequest, type UpdateKycStatusRequest, type UseKycAlertsOptions, type UseKycAlertsResult, type UseKycOverviewOptions, type UseKycOverviewResult, type UseKycPreferencesResult, type UseKycRequestsOptions, type UseKycRequestsResult, type UseKycSubmissionOptions, type UseKycSubmissionResult };
1149
+ export { type CheckKycStatusRequest, type CheckKycStatusResponse, CreateProfileRequest as CreateCustomerProfileRequest, type CreateEventBasedFaceVerificationSessionRequest, type CreateEventBasedFaceVerificationSessionResponse, CustomerProfile, ProfileFilters as CustomerProfileFilters, ProfileListResponse as CustomerProfileListResponse, type DocumentType, type DocumentVerificationRequest, type DocumentVerificationResponse, type EventBasedFaceVerificationCallback, type EventBasedFaceVerificationDeviceType, type EventBasedFaceVerificationEvent, type EventBasedFaceVerificationFrequencyTrigger, type EventBasedFaceVerificationReactionResult, type EventBasedFaceVerificationReactions, type EventBasedFaceVerificationThresholdTrigger, type EventBasedFaceVerificationTriggers, type FaceProof, KYC_DECLINED_DESCRIPTIONS, type KycAlert, type KycAlertFilters, type KycAlertListResponse, type KycAlertStatus, type KycAlertType, KycClient, type KycClientConfig, type KycCustomerData, type KycCustomerProfile, type KycDeclinedCode, type KycHandoffSession, type KycOverview, type KycPagination, type KycPreferences, type KycRequest, type KycRequestFilters, type KycRequestListResponse, type KycStatus, type Name, PaginationParams, type Proof, type ProofDownloadURL, type ProofType, type RequestAdditionalDocumentsRequest, type RequestKycSubmitLinkRequest, type RequestKycSubmitLinkResponse, RiskLevel, type SubmitEventBasedFaceVerificationSessionRequest, type SubmittedDocument, type SupportedDocumentType, type UpdateKycAlertRequest, type UpdateKycPreferencesRequest, type UpdateKycStatusRequest, type UseKycAlertsOptions, type UseKycAlertsResult, type UseKycOverviewOptions, type UseKycOverviewResult, type UseKycPreferencesResult, type UseKycRequestsOptions, type UseKycRequestsResult, type UseKycSubmissionOptions, type UseKycSubmissionResult };
@@ -1,6 +1,6 @@
1
1
  import { P as ProfileFilters, b as ProfileListResponse, C as CustomerProfile, a as CreateProfileRequest } from '../types-UGyDl1fd.js';
2
2
  import { c as Reason, R as RiskLevel, P as PaginationParams } from '../types-CBQRNL-l.js';
3
- import { B as BaseClient } from '../client-BolQlL5e.js';
3
+ import { B as BaseClient, R as RequestOptions } from '../client-q9fN8Hhf.js';
4
4
 
5
5
  /**
6
6
  * TypeScript type definitions for Vesant KYC Service API
@@ -318,8 +318,49 @@ interface RequestKycSubmitLinkRequest {
318
318
  redirect_url?: string;
319
319
  /** URL to receive callback notifications via POST request when KYC status changes (optional) */
320
320
  callback_url?: string;
321
- /** Event that triggered the KYC request (e.g. "onboarding", "login", "transaction") */
321
+ /**
322
+ * Event that triggered the KYC request. Valid values: "onboarding",
323
+ * "first_withdrawal", "first_purchase", "manual". The tenant's KYC
324
+ * verification trigger preferences decide, per event, whether KYC is
325
+ * required (`kyc_required` in the response). "manual" always requires
326
+ * KYC and honors the tenant's allow-skip-on-manual option (`can_skip`).
327
+ * Omitted or unknown values default to KYC required with no skip.
328
+ */
322
329
  trigger_event?: string;
330
+ /**
331
+ * Registered customer identity data (optional). Seeds the customer's risk
332
+ * profile so document verification can cross-check the submitted document
333
+ * against trusted reference data (name/DOB match, address verification).
334
+ * Fields never overwrite data already on the profile.
335
+ */
336
+ customer_data?: KycCustomerData;
337
+ }
338
+ /**
339
+ * Customer identity data supplied by your platform on a submit-link request.
340
+ * Mirrors the geolocation `customer_data` contract. Every field is optional
341
+ * and never overwrites data already on the customer's risk profile.
342
+ */
343
+ interface KycCustomerData {
344
+ /**
345
+ * Customer's registered full name. Used to match the OCR-extracted name
346
+ * on the submitted document.
347
+ */
348
+ full_name?: string;
349
+ /**
350
+ * Customer's registered date of birth. ISO 8601 date ("1999-06-02") or an
351
+ * RFC 3339 timestamp ("1986-09-06T18:30:00.000+00:00", as produced by
352
+ * `Date.prototype.toISOString()`) — for timestamps the date portion is
353
+ * used. Used for DOB matching against the submitted document.
354
+ */
355
+ date_of_birth?: string;
356
+ /** Customer's email address */
357
+ email?: string;
358
+ /** Customer's phone number */
359
+ phone?: string;
360
+ /** Customer's residential address. Used for address verification. */
361
+ address?: string;
362
+ /** Customer's country of residence */
363
+ country?: string;
323
364
  }
324
365
  /**
325
366
  * Trigger events that can request Event-Based Face Verification.
@@ -374,12 +415,34 @@ interface SubmitEventBasedFaceVerificationSessionRequest {
374
415
  proof: string;
375
416
  /** Unique reference for the KYC session (e.g., customer ID or transaction ID) */
376
417
  reference?: string;
418
+ /**
419
+ * Optional capture telemetry (JSON string): the face-detection
420
+ * bounding-box samples recorded in the moments before capture. Attached
421
+ * automatically by `FaceCaptureModal` when in-modal detection is active;
422
+ * omit when building a custom capture UI without detection. Stored
423
+ * verbatim server-side for audit/review — a weak presence signal, not
424
+ * certified anti-spoofing.
425
+ */
426
+ liveness_artifact?: string;
377
427
  }
378
428
  interface RequestKycSubmitLinkResponse {
379
429
  /** Generated KYC submission redirect URL */
380
430
  link: string;
381
431
  /** KYC request ID */
382
432
  kyc_id: string;
433
+ /**
434
+ * Whether KYC is required for the reported `trigger_event`, per the
435
+ * tenant's verification trigger preferences. `false` when the trigger
436
+ * is disabled for the tenant, or when the customer is already verified
437
+ * (in that case `link` and `kyc_id` are empty).
438
+ */
439
+ kyc_required: boolean;
440
+ /**
441
+ * Whether the user may skip verification. Only `true` for
442
+ * `trigger_event: "manual"` when the tenant enables allow-skip-on-manual,
443
+ * or when the customer is already verified.
444
+ */
445
+ can_skip: boolean;
383
446
  }
384
447
  /** Device class detected by the SDK (purely client-side — server doesn't care). */
385
448
  type EventBasedFaceVerificationDeviceType = 'mobile' | 'desktop';
@@ -657,7 +720,7 @@ interface UseKycPreferencesResult extends BaseHookState {
657
720
  */
658
721
  declare class KycClient extends BaseClient {
659
722
  private userId?;
660
- private riskProfileBaseURL?;
723
+ private readonly riskProfileBaseURL?;
661
724
  constructor(config: KycClientConfig);
662
725
  /**
663
726
  * Set the user ID for operations requiring user context
@@ -676,7 +739,13 @@ declare class KycClient extends BaseClient {
676
739
  *
677
740
  * Generates a link that the user can visit to submit their KYC documents.
678
741
  *
679
- * @param request - Request containing the user ID, optional redirect URL, and optional callback URL (receives POST requests)
742
+ * Optionally pass the customer's registered identity data as
743
+ * `customer_data` (same shape as the geolocation `customer_data` block).
744
+ * It seeds the customer's risk profile so document verification can
745
+ * cross-check the submitted document against trusted reference data;
746
+ * fields never overwrite data already on the profile.
747
+ *
748
+ * @param request - Request containing the user ID, optional redirect URL, optional callback URL (receives POST requests), and optional customer identity data
680
749
  * @returns Response containing the redirect link and KYC ID
681
750
  *
682
751
  * @example
@@ -684,14 +753,22 @@ declare class KycClient extends BaseClient {
684
753
  * const result = await client.requestKycSubmitLink({
685
754
  * user_id: "user_123",
686
755
  * redirect_url: "https://merchant.com/kyc-complete", // optional
687
- * callback_url: "https://merchant.com/api/kyc-webhook" // optional - receives POST requests on status change
756
+ * callback_url: "https://merchant.com/api/kyc-webhook", // optional - receives POST requests on status change
757
+ * customer_data: { // optional - seeds the risk profile for document cross-checks
758
+ * full_name: "John Doe",
759
+ * date_of_birth: "1999-06-02", // ISO 8601
760
+ * email: "john@example.com",
761
+ * phone: "+94771234567",
762
+ * address: "12 Main St, Colombo", // used for address verification
763
+ * country: "LK"
764
+ * }
688
765
  * });
689
766
  *
690
767
  * console.log(`Redirect user to: ${result.link}`);
691
768
  * console.log(`KYC ID: ${result.kyc_id}`);
692
769
  * ```
693
770
  */
694
- requestKycSubmitLink(request: RequestKycSubmitLinkRequest): Promise<RequestKycSubmitLinkResponse>;
771
+ requestKycSubmitLink(request: RequestKycSubmitLinkRequest, requestOptions?: RequestOptions): Promise<RequestKycSubmitLinkResponse>;
695
772
  /**
696
773
  * Create a Event-Based Face Verification session.
697
774
  *
@@ -717,7 +794,7 @@ declare class KycClient extends BaseClient {
717
794
  *
718
795
  * @param request - Token from `createEventBasedFaceVerificationSession`, plus the base64 selfie.
719
796
  */
720
- submitEventBasedFaceVerificationSession(request: SubmitEventBasedFaceVerificationSessionRequest): Promise<EventBasedFaceVerificationCallback>;
797
+ submitEventBasedFaceVerificationSession(request: SubmitEventBasedFaceVerificationSessionRequest, requestOptions?: RequestOptions): Promise<EventBasedFaceVerificationCallback>;
721
798
  /**
722
799
  * Look up the current state of a Event-Based Face Verification session by its
723
800
  * session token. Useful for desktop pollers waiting on the mobile handoff.
@@ -789,7 +866,7 @@ declare class KycClient extends BaseClient {
789
866
  * @example
790
867
  * ```typescript
791
868
  * const result = await client.submitVerification({
792
- * reference: "customer_123",
869
+ * reference: "4d2aff34-ab86-422d-992e-50b1234a5b67",
793
870
  * email: "customer@example.com",
794
871
  * country: "US",
795
872
  * document: {
@@ -806,7 +883,7 @@ declare class KycClient extends BaseClient {
806
883
  * console.log(`Verification submitted: ${result.reference}`);
807
884
  * ```
808
885
  */
809
- submitVerification(request: DocumentVerificationRequest): Promise<DocumentVerificationResponse>;
886
+ submitVerification(request: DocumentVerificationRequest, requestOptions?: RequestOptions): Promise<DocumentVerificationResponse>;
810
887
  /**
811
888
  * Get a KYC request by ID
812
889
  *
@@ -815,7 +892,7 @@ declare class KycClient extends BaseClient {
815
892
  *
816
893
  * @example
817
894
  * ```typescript
818
- * const kyc = await client.getKycRequest("kyc_abc123");
895
+ * const kyc = await client.getKycRequest("550e8400-e29b-41d4-a716-446655440000");
819
896
  * console.log(`Status: ${kyc.status}, ID Verified: ${kyc.id_verified}`);
820
897
  * ```
821
898
  */
@@ -868,7 +945,7 @@ declare class KycClient extends BaseClient {
868
945
  * @example
869
946
  * ```typescript
870
947
  * await client.requestAdditionalDocuments({
871
- * id: "kyc_abc123",
948
+ * id: "550e8400-e29b-41d4-a716-446655440000",
872
949
  * document_types: ["address", "document_two"],
873
950
  * message: "Please provide proof of address and secondary ID"
874
951
  * });
@@ -883,7 +960,7 @@ declare class KycClient extends BaseClient {
883
960
  *
884
961
  * @example
885
962
  * ```typescript
886
- * const proofs = await client.getProofDownloadURLs("kyc_abc123");
963
+ * const proofs = await client.getProofDownloadURLs("550e8400-e29b-41d4-a716-446655440000");
887
964
  * proofs.forEach(proof => {
888
965
  * console.log(`${proof.type}: ${proof.url} (expires: ${proof.expires_at})`);
889
966
  * });
@@ -1069,4 +1146,4 @@ declare class KycClient extends BaseClient {
1069
1146
  createCustomerProfile(profile: CreateProfileRequest): Promise<CustomerProfile>;
1070
1147
  }
1071
1148
 
1072
- export { type CheckKycStatusRequest, type CheckKycStatusResponse, CreateProfileRequest as CreateCustomerProfileRequest, type CreateEventBasedFaceVerificationSessionRequest, type CreateEventBasedFaceVerificationSessionResponse, CustomerProfile, ProfileFilters as CustomerProfileFilters, ProfileListResponse as CustomerProfileListResponse, type DocumentType, type DocumentVerificationRequest, type DocumentVerificationResponse, type EventBasedFaceVerificationCallback, type EventBasedFaceVerificationDeviceType, type EventBasedFaceVerificationEvent, type EventBasedFaceVerificationFrequencyTrigger, type EventBasedFaceVerificationReactionResult, type EventBasedFaceVerificationReactions, type EventBasedFaceVerificationThresholdTrigger, type EventBasedFaceVerificationTriggers, type FaceProof, KYC_DECLINED_DESCRIPTIONS, type KycAlert, type KycAlertFilters, type KycAlertListResponse, type KycAlertStatus, type KycAlertType, KycClient, type KycClientConfig, type KycCustomerProfile, type KycDeclinedCode, type KycHandoffSession, type KycOverview, type KycPagination, type KycPreferences, type KycRequest, type KycRequestFilters, type KycRequestListResponse, type KycStatus, type Name, PaginationParams, type Proof, type ProofDownloadURL, type ProofType, type RequestAdditionalDocumentsRequest, type RequestKycSubmitLinkRequest, type RequestKycSubmitLinkResponse, RiskLevel, type SubmitEventBasedFaceVerificationSessionRequest, type SubmittedDocument, type SupportedDocumentType, type UpdateKycAlertRequest, type UpdateKycPreferencesRequest, type UpdateKycStatusRequest, type UseKycAlertsOptions, type UseKycAlertsResult, type UseKycOverviewOptions, type UseKycOverviewResult, type UseKycPreferencesResult, type UseKycRequestsOptions, type UseKycRequestsResult, type UseKycSubmissionOptions, type UseKycSubmissionResult };
1149
+ export { type CheckKycStatusRequest, type CheckKycStatusResponse, CreateProfileRequest as CreateCustomerProfileRequest, type CreateEventBasedFaceVerificationSessionRequest, type CreateEventBasedFaceVerificationSessionResponse, CustomerProfile, ProfileFilters as CustomerProfileFilters, ProfileListResponse as CustomerProfileListResponse, type DocumentType, type DocumentVerificationRequest, type DocumentVerificationResponse, type EventBasedFaceVerificationCallback, type EventBasedFaceVerificationDeviceType, type EventBasedFaceVerificationEvent, type EventBasedFaceVerificationFrequencyTrigger, type EventBasedFaceVerificationReactionResult, type EventBasedFaceVerificationReactions, type EventBasedFaceVerificationThresholdTrigger, type EventBasedFaceVerificationTriggers, type FaceProof, KYC_DECLINED_DESCRIPTIONS, type KycAlert, type KycAlertFilters, type KycAlertListResponse, type KycAlertStatus, type KycAlertType, KycClient, type KycClientConfig, type KycCustomerData, type KycCustomerProfile, type KycDeclinedCode, type KycHandoffSession, type KycOverview, type KycPagination, type KycPreferences, type KycRequest, type KycRequestFilters, type KycRequestListResponse, type KycStatus, type Name, PaginationParams, type Proof, type ProofDownloadURL, type ProofType, type RequestAdditionalDocumentsRequest, type RequestKycSubmitLinkRequest, type RequestKycSubmitLinkResponse, RiskLevel, type SubmitEventBasedFaceVerificationSessionRequest, type SubmittedDocument, type SupportedDocumentType, type UpdateKycAlertRequest, type UpdateKycPreferencesRequest, type UpdateKycStatusRequest, type UseKycAlertsOptions, type UseKycAlertsResult, type UseKycOverviewOptions, type UseKycOverviewResult, type UseKycPreferencesResult, type UseKycRequestsOptions, type UseKycRequestsResult, type UseKycSubmissionOptions, type UseKycSubmissionResult };
package/dist/kyc/index.js CHANGED
@@ -1,5 +1,18 @@
1
1
  'use strict';
2
2
 
3
+ // src/core/auth.ts
4
+ var StaticApiKeyProvider = class {
5
+ constructor(apiKey) {
6
+ this.apiKey = apiKey;
7
+ }
8
+ async getCredential() {
9
+ return this.apiKey ? { scheme: "Bearer", token: this.apiKey } : null;
10
+ }
11
+ canRefresh() {
12
+ return false;
13
+ }
14
+ };
15
+
3
16
  // src/core/errors.ts
4
17
  var VesantError = class _VesantError extends Error {
5
18
  constructor(message, code, statusCode, details) {
@@ -241,6 +254,12 @@ var BaseClient = class {
241
254
  if (!config.tenantId?.trim()) {
242
255
  throw new ValidationError("tenantId is required and must be a non-empty string", ["tenantId"]);
243
256
  }
257
+ if (typeof fetch === "undefined") {
258
+ throw new VesantError(
259
+ "The Vesant SDK requires a global fetch (Node.js >= 18). Upgrade Node or provide a fetch polyfill.",
260
+ "RUNTIME_UNSUPPORTED"
261
+ );
262
+ }
244
263
  this.interceptors = config.interceptors || [];
245
264
  this.logger = config.logger || createConsoleLogger();
246
265
  let environment = config.environment;
@@ -259,11 +278,12 @@ var BaseClient = class {
259
278
  environment,
260
279
  headers: config.headers || {},
261
280
  timeout: config.timeout || 1e4,
262
- retries: config.retries || 3,
281
+ retries: config.retries ?? 3,
263
282
  debug: config.debug || false,
264
283
  interceptors: this.interceptors,
265
284
  logger: this.logger
266
285
  };
286
+ this.authProvider = config.authProvider ?? (apiKey ? new StaticApiKeyProvider(apiKey) : void 0);
267
287
  if (config.circuitBreaker) {
268
288
  this.circuitBreaker = new CircuitBreaker(config.circuitBreaker);
269
289
  }
@@ -271,6 +291,19 @@ var BaseClient = class {
271
291
  this.rateLimitTracker = new RateLimitTracker();
272
292
  }
273
293
  }
294
+ /**
295
+ * Resolve the Idempotency-Key for a request. Mutating methods (POST/PUT/PATCH)
296
+ * get the caller-supplied key or a freshly minted UUID; non-mutating methods get
297
+ * none. requestWithRetry resolves this once and injects it so every retry reuses
298
+ * one key (letting the server dedup replays); a direct request() resolves per call.
299
+ */
300
+ resolveIdempotencyKey(method, requestOptions) {
301
+ const isMutating = ["POST", "PUT", "PATCH"].includes((method || "GET").toUpperCase());
302
+ if (!isMutating) {
303
+ return void 0;
304
+ }
305
+ return requestOptions?.idempotencyKey ?? generateUUID();
306
+ }
274
307
  /**
275
308
  * Make an HTTP request with timeout and error handling
276
309
  */
@@ -296,15 +329,20 @@ var BaseClient = class {
296
329
  ...this.config.headers,
297
330
  ...options.headers || {}
298
331
  };
299
- if (this.config.apiKey) {
300
- headers["Authorization"] = `Bearer ${this.config.apiKey}`;
332
+ const credential = await this.authProvider?.getCredential({
333
+ tenantId: this.config.tenantId,
334
+ requestId
335
+ });
336
+ if (credential) {
337
+ headers["Authorization"] = `${credential.scheme ?? "Bearer"} ${credential.token}`;
301
338
  }
302
339
  if (this.config.environment === "sandbox") {
303
340
  headers["X-Sandbox"] = "true";
304
341
  }
305
342
  const method = (options.method || "GET").toUpperCase();
306
- if (["POST", "PUT", "PATCH"].includes(method)) {
307
- headers["Idempotency-Key"] = requestOptions?.idempotencyKey || generateUUID();
343
+ const idempotencyKey = this.resolveIdempotencyKey(method, requestOptions);
344
+ if (idempotencyKey) {
345
+ headers["Idempotency-Key"] = idempotencyKey;
308
346
  }
309
347
  const controller = new AbortController();
310
348
  const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);
@@ -325,10 +363,28 @@ var BaseClient = class {
325
363
  if (this.config.debug) {
326
364
  this.logger.debug(`${finalOptions.method || "GET"} ${endpoint}`);
327
365
  }
328
- const response = await fetch(url, {
366
+ let response = await fetch(url, {
329
367
  ...finalOptions,
330
368
  signal: controller.signal
331
369
  });
370
+ if (response.status === 401 && this.authProvider?.canRefresh?.()) {
371
+ const refreshed = await this.authProvider.getCredential({
372
+ tenantId: this.config.tenantId,
373
+ requestId,
374
+ forceRefresh: true
375
+ });
376
+ if (refreshed) {
377
+ this.config.onCredentialRotated?.({ reason: "unauthorized" });
378
+ finalOptions = {
379
+ ...finalOptions,
380
+ headers: {
381
+ ...finalOptions.headers,
382
+ Authorization: `${refreshed.scheme ?? "Bearer"} ${refreshed.token}`
383
+ }
384
+ };
385
+ response = await fetch(url, { ...finalOptions, signal: controller.signal });
386
+ }
387
+ }
332
388
  clearTimeout(timeoutId);
333
389
  if (this.rateLimitTracker) {
334
390
  this.rateLimitTracker.updateFromHeaders(response.headers);
@@ -417,9 +473,11 @@ var BaseClient = class {
417
473
  */
418
474
  async requestWithRetry(endpoint, options = {}, serviceURL, retries = this.config.retries, requestOptions) {
419
475
  let lastError;
476
+ const idempotencyKey = this.resolveIdempotencyKey(options.method || "GET", requestOptions);
477
+ const attemptOptions = idempotencyKey ? { ...requestOptions, idempotencyKey } : requestOptions;
420
478
  for (let attempt = 0; attempt <= retries; attempt++) {
421
479
  try {
422
- return await this.request(endpoint, options, serviceURL, requestOptions);
480
+ return await this.request(endpoint, options, serviceURL, attemptOptions);
423
481
  } catch (error) {
424
482
  lastError = error instanceof Error ? error : new Error("Unknown error");
425
483
  if (requestOptions?.signal?.aborted) {
@@ -516,6 +574,9 @@ var BaseClient = class {
516
574
  if (config.interceptors) {
517
575
  this.interceptors = config.interceptors;
518
576
  }
577
+ if (config.authProvider !== void 0 || config.apiKey !== void 0) {
578
+ this.authProvider = this.config.authProvider ?? (this.config.apiKey ? new StaticApiKeyProvider(this.config.apiKey) : void 0);
579
+ }
519
580
  }
520
581
  /**
521
582
  * Get current configuration (readonly)
@@ -603,7 +664,13 @@ var KycClient = class extends BaseClient {
603
664
  *
604
665
  * Generates a link that the user can visit to submit their KYC documents.
605
666
  *
606
- * @param request - Request containing the user ID, optional redirect URL, and optional callback URL (receives POST requests)
667
+ * Optionally pass the customer's registered identity data as
668
+ * `customer_data` (same shape as the geolocation `customer_data` block).
669
+ * It seeds the customer's risk profile so document verification can
670
+ * cross-check the submitted document against trusted reference data;
671
+ * fields never overwrite data already on the profile.
672
+ *
673
+ * @param request - Request containing the user ID, optional redirect URL, optional callback URL (receives POST requests), and optional customer identity data
607
674
  * @returns Response containing the redirect link and KYC ID
608
675
  *
609
676
  * @example
@@ -611,19 +678,27 @@ var KycClient = class extends BaseClient {
611
678
  * const result = await client.requestKycSubmitLink({
612
679
  * user_id: "user_123",
613
680
  * redirect_url: "https://merchant.com/kyc-complete", // optional
614
- * callback_url: "https://merchant.com/api/kyc-webhook" // optional - receives POST requests on status change
681
+ * callback_url: "https://merchant.com/api/kyc-webhook", // optional - receives POST requests on status change
682
+ * customer_data: { // optional - seeds the risk profile for document cross-checks
683
+ * full_name: "John Doe",
684
+ * date_of_birth: "1999-06-02", // ISO 8601
685
+ * email: "john@example.com",
686
+ * phone: "+94771234567",
687
+ * address: "12 Main St, Colombo", // used for address verification
688
+ * country: "LK"
689
+ * }
615
690
  * });
616
691
  *
617
692
  * console.log(`Redirect user to: ${result.link}`);
618
693
  * console.log(`KYC ID: ${result.kyc_id}`);
619
694
  * ```
620
695
  */
621
- async requestKycSubmitLink(request) {
696
+ async requestKycSubmitLink(request, requestOptions) {
622
697
  return this.requestWithRetry("/api/v1/kyc/request", {
623
698
  method: "POST",
624
699
  body: JSON.stringify(request),
625
700
  headers: this.getUserHeaders()
626
- });
701
+ }, void 0, void 0, requestOptions);
627
702
  }
628
703
  /**
629
704
  * Create a Event-Based Face Verification session.
@@ -656,12 +731,12 @@ var KycClient = class extends BaseClient {
656
731
  *
657
732
  * @param request - Token from `createEventBasedFaceVerificationSession`, plus the base64 selfie.
658
733
  */
659
- async submitEventBasedFaceVerificationSession(request) {
734
+ async submitEventBasedFaceVerificationSession(request, requestOptions) {
660
735
  return this.request("/api/v1/kyc/face/submit", {
661
736
  method: "POST",
662
737
  body: JSON.stringify(request),
663
738
  headers: this.getUserHeaders()
664
- });
739
+ }, void 0, requestOptions);
665
740
  }
666
741
  /**
667
742
  * Look up the current state of a Event-Based Face Verification session by its
@@ -760,7 +835,7 @@ var KycClient = class extends BaseClient {
760
835
  * @example
761
836
  * ```typescript
762
837
  * const result = await client.submitVerification({
763
- * reference: "customer_123",
838
+ * reference: "4d2aff34-ab86-422d-992e-50b1234a5b67",
764
839
  * email: "customer@example.com",
765
840
  * country: "US",
766
841
  * document: {
@@ -777,12 +852,12 @@ var KycClient = class extends BaseClient {
777
852
  * console.log(`Verification submitted: ${result.reference}`);
778
853
  * ```
779
854
  */
780
- async submitVerification(request) {
855
+ async submitVerification(request, requestOptions) {
781
856
  return this.requestWithRetry("/api/v1/kyc/submit", {
782
857
  method: "POST",
783
858
  body: JSON.stringify(request),
784
859
  headers: this.getUserHeaders()
785
- });
860
+ }, void 0, void 0, requestOptions);
786
861
  }
787
862
  /**
788
863
  * Get a KYC request by ID
@@ -792,7 +867,7 @@ var KycClient = class extends BaseClient {
792
867
  *
793
868
  * @example
794
869
  * ```typescript
795
- * const kyc = await client.getKycRequest("kyc_abc123");
870
+ * const kyc = await client.getKycRequest("550e8400-e29b-41d4-a716-446655440000");
796
871
  * console.log(`Status: ${kyc.status}, ID Verified: ${kyc.id_verified}`);
797
872
  * ```
798
873
  */
@@ -867,7 +942,7 @@ var KycClient = class extends BaseClient {
867
942
  * @example
868
943
  * ```typescript
869
944
  * await client.requestAdditionalDocuments({
870
- * id: "kyc_abc123",
945
+ * id: "550e8400-e29b-41d4-a716-446655440000",
871
946
  * document_types: ["address", "document_two"],
872
947
  * message: "Please provide proof of address and secondary ID"
873
948
  * });
@@ -888,7 +963,7 @@ var KycClient = class extends BaseClient {
888
963
  *
889
964
  * @example
890
965
  * ```typescript
891
- * const proofs = await client.getProofDownloadURLs("kyc_abc123");
966
+ * const proofs = await client.getProofDownloadURLs("550e8400-e29b-41d4-a716-446655440000");
892
967
  * proofs.forEach(proof => {
893
968
  * console.log(`${proof.type}: ${proof.url} (expires: ${proof.expires_at})`);
894
969
  * });