import {z} from 'zod' export type GetApiOmniGetScoreArgs = {id?: string | undefined, 'api-version': string}; export type GetApiOmniGetScoreOptions = {baseUrl?: string | undefined, ApiKeyAuth?: string | undefined, IncodeHardwareIdAuth?: string | undefined, fetch?: typeof fetch | undefined}; export const resultBean = z.object({value: z.string().optional(), status: z.enum(["OK", "WARN", "FAIL", "UNKNOWN", "MANUAL", "MANUAL_OK", "MANUAL_FAIL", "MANUAL_PENDING"]).optional()}); export const appliedFlowRule = z.object({name: z.string().optional(), expression: z.string().optional(), ruleType: z.enum(["idValidation", "secondIdValidation", "faceValidation", "liveness", "deepsight", "eKyc", "videoselfie", "faceAuthentication", "total", "phoneRisk", "emailRisk", "governmentValidation"]).optional(), status: z.enum(["OK", "WARN", "FAIL", "UNKNOWN", "MANUAL", "MANUAL_OK", "MANUAL_FAIL", "MANUAL_PENDING"]).optional()}); export const authenticationDto = z.object({overall: resultBean.optional(), identityId: z.string().optional(), appliedRule: appliedFlowRule.optional()}); export const idResultBean = z.object({value: z.string().optional(), status: z.enum(["OK", "WARN", "FAIL", "UNKNOWN", "MANUAL", "MANUAL_OK", "MANUAL_FAIL", "MANUAL_PENDING"]).optional(), key: z.string().optional()}); export const idValidation = z.object({photoSecurityAndQuality: z.array(idResultBean).optional(), idSpecific: z.array(idResultBean).optional(), customFields: z.array(idResultBean).optional(), appliedRule: appliedFlowRule.optional(), overall: resultBean.optional()}); export const antifraudScoreValidation = z.object({overall: resultBean.optional()}); export const livenessDto = z.object({hasHeadCover: resultBean.optional(), hasClosedEyes: resultBean.optional(), physicalAttack: resultBean.optional(), digitalAttack: resultBean.optional(), evasionAttack: resultBean.optional(), deepfakeAttack: resultBean.optional(), digitalManipulationAttack: resultBean.optional(), appliedRule: appliedFlowRule.optional(), spoofDetectionMethod: z.enum(["SF", "SF_MM", "SF_MM_V"]).optional(), overall: resultBean.optional(), livenessScore: resultBean.optional()}); export const spoofDetectionExplanationKeywordsDto = z.object({category: z.string().optional(), isDepthFlat: z.boolean().optional(), isVideoCorrupted: z.boolean().optional()}); export const spoofResultExplanationDto = z.object({description: z.string().optional(), keywords: spoofDetectionExplanationKeywordsDto.optional()}); export const multimodalIntelligenceDto = z.object({physicalAttack: resultBean.optional(), digitalAttack: resultBean.optional(), deepfakeAttack: resultBean.optional(), digitalManipulationAttack: resultBean.optional(), evasionAttack: resultBean.optional(), spoofDetectionMethod: z.enum(["SF", "SF_MM", "SF_MM_V"]).optional(), faceExplanation: spoofResultExplanationDto.optional(), faceOverall: resultBean.optional(), aiGeneratedDocument: resultBean.optional(), documentOverall: resultBean.optional(), overall: resultBean.optional()}); export const deviceTrustScoreDto = z.object({overall: resultBean.optional()}); export const behavioralTrustScoreDto = z.object({overall: resultBean.optional()}); export const cameraTrustScoreDto = z.object({overall: resultBean.optional()}); export const deepsightScoreDto = z.object({multimodalIntelligence: multimodalIntelligenceDto.optional(), deviceTrust: deviceTrustScoreDto.optional(), behavioralTrust: behavioralTrustScoreDto.optional(), cameraTrust: cameraTrustScoreDto.optional(), overall: resultBean.optional(), appliedRule: appliedFlowRule.optional()}); export const faceAttributesScoreDto = z.object({maskCheck: resultBean.optional(), lensesCheck: resultBean.optional(), hasHeadCover: resultBean.optional(), hasClosedEyes: resultBean.optional(), faceOcclusion: resultBean.optional()}); export const qualityChecksScoreDto = z.object({faceBrightness: resultBean.optional(), imageQuality: resultBean.optional()}); export const faceCaptureAssessmentScoreDto = z.object({faceAttributes: faceAttributesScoreDto.optional(), qualityChecks: qualityChecksScoreDto.optional()}); export const appliedFlowRuleDto = z.object({name: z.string().optional(), expression: z.string().optional(), ruleType: z.enum(["idValidation", "secondIdValidation", "faceValidation", "liveness", "deepsight", "eKyc", "videoselfie", "faceAuthentication", "total", "phoneRisk", "emailRisk", "governmentValidation"]).optional(), status: z.enum(["OK", "WARN", "FAIL", "UNKNOWN", "MANUAL", "MANUAL_OK", "MANUAL_FAIL", "MANUAL_PENDING"]).optional()}); export const faceRecognitionDto = z.object({existingUser: z.boolean().optional(), customerId: z.string().optional(), existingInterviewId: z.string().optional(), existingExternalId: z.string().optional(), maskCheck: resultBean.optional(), lensesCheck: resultBean.optional(), faceBrightness: resultBean.optional(), imageQuality: resultBean.optional(), nameMatch: resultBean.optional(), appliedRule: appliedFlowRuleDto.optional(), overall: resultBean.optional(), hasHeadCover: resultBean.optional(), hasClosedEyes: resultBean.optional(), faceOcclusion: resultBean.optional()}); export const governmentValidation = z.object({recognitionConfidence: resultBean.optional(), fingerprintConfidence: resultBean.optional(), minimumPassingFingerprints: z.number().int().optional(), validationStatus: idResultBean.optional(), ocrValidation: z.array(idResultBean).optional(), ocrValidationOverall: resultBean.optional(), overall: resultBean.optional(), provider: z.string().optional(), appliedRule: appliedFlowRule.optional()}); export const videoSelfie = z.object({speechTranscript: z.string().optional(), speechTranscriptWhisper: z.string().optional(), videoSelfieLiveness: resultBean.optional(), videoSelfieFaceRecognition: resultBean.optional(), speechRecognition: resultBean.optional(), score: resultBean.optional(), appliedRule: appliedFlowRule.optional()}); export const curpResponse = z.object({success: z.boolean().optional(), curp: z.string().optional(), sex: z.enum(["Mujer", "Hombre", "X"]).optional(), nationality: z.string().optional(), result: z.string().optional(), transactionId: z.string().optional(), renapo_valid: z.boolean().optional(), names: z.string().optional(), paternal_surname: z.string().optional(), mothers_maiden_name: z.string().optional(), birthdate: z.string().optional(), entity_birth: z.string().optional(), probation_document: z.string().optional(), probation_document_data: z.record(z.string(), z.object({})).optional(), status_curp: z.string().optional(), deceasedStatus: z.string().optional()}); export const ineResult = z.object({get_version: z.number().int().optional(), scrapingStatus: z.enum(["IN_PROGRESS", "FINISHED", "ERROR"]).optional(), success: z.boolean().optional(), result: z.enum(["success", "error"]).optional(), resultDetails: z.string().optional(), screenshotUrl: z.string().optional(), cic: z.string().optional(), claveElector: z.string().optional(), numeroEmision: z.string().optional(), ocr: z.string().optional(), anioRegistro: z.string().optional(), anioEmision: z.string().optional()}); export const idOcrConfidence = z.object({overallConfidence: resultBean.optional()}); export const incodeWatchlistScore = z.object({watchlistScore: resultBean.optional(), dataMatches: z.array(z.string()).optional(), incodeWatchlistId: z.string().optional()}); export const retryInfo = z.object({failedAttemptsCounter: z.record(z.string(), z.number().int()).optional(), stepsToRetry: z.array(z.enum(["frontId", "backId", "selfie", "poa", "governmentValidation"])).optional()}); export const documentOnEdgeInfo = z.object({frontDocumentIsOnTheEdge: z.boolean().optional(), backDocumentIsOnTheEdge: z.boolean().optional()}); export const sessionRecordingQualityChecksScore = z.object({fileIsPresent: z.enum(["PRESENT", "NOT_PRESENT", "UNKNOWN"]).optional(), hasVideo: z.enum(["YES", "NO", "UNKNOWN"]).optional(), hasAudio: z.enum(["YES", "NO", "UNKNOWN"]).optional(), fileNotEmpty: z.enum(["NOT_EMPTY", "EMPTY", "UNKNOWN"]).optional(), recordingQuality: resultBean.optional()}); export const sessionRecording = z.object({mergedRecordingQualityChecks: sessionRecordingQualityChecksScore.optional()}); export const trustGraphRiskResults = z.object({overall: resultBean.optional(), reasonCategoryScores: z.record(z.string(), z.enum(["OK", "AT_RISK", "NOT_EXECUTED"])).optional()}); export const trustGraph = z.object({riskResults: trustGraphRiskResults.optional()}); export const identityCrosscheck = z.object({overall: resultBean.optional(), checks: z.record(z.string(), resultBean).optional(), riskLevel: z.string().optional()}); export const invoice = z.object({overall: resultBean.optional(), checks: z.record(z.string(), resultBean).optional()}); export const autopilotDto = z.object({overall: resultBean.optional(), failedFeatures: z.array(z.string()).optional(), legitFeatures: z.array(z.string()).optional(), responseText: z.string().optional(), responseCategory: z.string().optional()}); export const scoreResponseDto = z.object({authentication: authenticationDto.optional(), idValidation: idValidation.optional(), antifraud: antifraudScoreValidation.optional(), secondIdValidation: idValidation.optional(), liveness: livenessDto.optional(), deepsight: deepsightScoreDto.optional(), faceCaptureAssessment: faceCaptureAssessmentScoreDto.optional(), faceRecognition: faceRecognitionDto.optional(), faceRecognitionSecondId: faceRecognitionDto.optional(), governmentValidation: governmentValidation.optional(), videoConference: videoSelfie.optional(), curpVerification: curpResponse.optional(), ineScrapingValidation: ineResult.optional(), idOcrConfidence: idOcrConfidence.optional(), idOcrConfidenceSecondId: idOcrConfidence.optional(), incodeWatchlistScore: incodeWatchlistScore.optional(), retryInfo: retryInfo.optional(), documentOnEdgeInfo: documentOnEdgeInfo.optional(), appliedRule: appliedFlowRule.optional(), needsReviewReason: z.enum(["MANUAL_CAPTURE", "RULE_APPLIED", "OLD_ID", "FLOW_CONFIGURATION", "FRONT_ID_CAPTURE_ATTEMPTS", "BACK_ID_CAPTURE_ATTEMPTS", "SELFIE_CAPTURE_ATTEMPTS", "ANTIFRAUD", "MISSING_DEPTH_DATA"]).optional(), sessionRecording: sessionRecording.optional(), trustGraph: trustGraph.optional(), identityCrosscheck: identityCrosscheck.optional(), invoiceValidation: invoice.optional(), autopilot: autopilotDto.optional(), overall: resultBean.optional()}); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * Fetch scores * * GET /omni/get/score */ export const getApiOmniGetScore = async (args: GetApiOmniGetScoreArgs, options?: GetApiOmniGetScoreOptions) => { const {baseUrl = "https://demo-api.incodesmile.com", fetch: fetchFn = fetch, ApiKeyAuth, IncodeHardwareIdAuth} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.id != null) query.append("id", String(args.id)) if (args['api-version'] != null) headers.set("api-version", String(args['api-version'])) if (ApiKeyAuth !== undefined) headers.set("x-api-key", ApiKeyAuth) if (IncodeHardwareIdAuth !== undefined) headers.set("X-Incode-Hardware-Id", IncodeHardwareIdAuth) const url = `${baseUrl.replace(/\/+$/, '')}/omni/get/score${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "GET", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(scoreResponseDto, await res.json()) };