import {z} from 'zod' export type FingerprintMetadata = {device?: string | undefined, resolution?: string | undefined, qualityScore?: string | undefined}; export type Fingerprint = {index?: number | undefined, base64Fingerprint?: string | undefined, fingerprintMetadata?: FingerprintMetadata | undefined}; export type FingerprintsData = {type?: number | undefined, fingerprints: Array}; export type GovernmentValidationDataRequest = {ocr?: string | undefined, cic?: string | undefined, nombre?: string | undefined, apellidoPaterno?: string | undefined, apellidoMaterno?: string | undefined, anioRegistro?: string | undefined, anioEmision?: string | undefined, numeroEmisionCredencial?: string | undefined, claveElector?: string | undefined, curp?: string | undefined, base64Image?: string | undefined, idNumber?: string | undefined, fechaEmision?: string | undefined, personalNumber?: string | undefined, birthDate?: string | undefined, gender?: string | undefined, birthPlace?: string | undefined, address?: string | undefined, latitude?: string | undefined, longitude?: string | undefined, macAddress?: string | undefined, ip?: string | undefined, osVersion?: string | undefined, applicationName?: string | undefined, sufix?: string | undefined, firstName?: string | undefined, givenName?: string | undefined, middleName?: string | undefined, maternalLastName?: string | undefined, paternalLastName?: string | undefined, documentType?: ('Unknown' | 'Passport' | 'Visa' | 'DriversLicense' | 'IdentificationCard' | 'Permit' | 'Currency' | 'ResidenceDocument' | 'TravelDocument' | 'BirthCertificate' | 'VehicleRegistration' | 'Other' | 'WeaponLicense' | 'TribalIdentification' | 'VoterIdentification' | 'Military' | 'TaxIdentification' | 'FederalID' | 'MedicalCard') | undefined, refNumber?: string | undefined, issuerState?: string | undefined, documentTypeId?: number | undefined, issuedAt?: string | undefined, documentNumber?: string | undefined, expireAt?: string | undefined, eyeColor?: string | undefined, height?: string | undefined, weight?: string | undefined, city?: string | undefined, postalCode?: string | undefined, email?: string | undefined, fullName?: string | undefined, nationality?: string | undefined, dateFormat?: string | undefined, fingerprintsData?: FingerprintsData | undefined}; export type CreateApiOmniProcessGovernmentValidationArgs = {fallbackEnabled?: boolean | undefined, scrapingMethod?: boolean | undefined, scrapingV2?: boolean | undefined, scrapingV3?: boolean | undefined, telcel?: boolean | undefined, interviewId?: string | undefined, countryCode?: string | undefined, 'api-version': string, body: GovernmentValidationDataRequest}; export type CreateApiOmniProcessGovernmentValidationOptions = {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 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 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 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 registralSituation = z.object({tipoSituacionRegistral: z.string().optional(), tipoReporteRoboExtravio: z.string().optional()}); export const curpCecobanValidation = z.object({returnCode: z.string().optional(), description: z.string().optional(), uniquePopulationRegistrationKeyMatch: z.boolean().optional()}); export const nameBean = z.object({fullName: z.string().optional(), fullNameNativeScript: z.string().optional(), firstNameNativeScript: z.string().optional(), paternalLastNameNativeScript: z.string().optional(), maternalLastNameNativeScript: z.string().optional(), machineReadableFullName: z.string().optional(), firstName: z.string().optional(), middleName: z.string().optional(), givenName: z.string().optional(), givenNameMrz: z.string().optional(), nameSuffix: z.string().optional(), paternalLastName: z.string().optional(), maternalLastName: z.string().optional(), lastNameMrz: z.string().optional(), familyName: z.string().optional()}); export const addressBean = z.object({street: z.string().optional(), streetName: z.string().optional(), colony: z.string().optional(), postalCode: z.string().optional(), city: z.string().optional(), state: z.string().optional(), stateName: z.string().optional(), district: z.string().optional(), stateCode: z.string().optional(), addressCountryCode: z.string().optional(), label: z.string().optional(), exteriorNumber: z.string().optional(), interiorNumber: z.string().optional(), addressLine1: z.string().optional(), streetType: z.string().optional()}); export const addressStatementDate = z.object({get_version: z.number().int().optional(), dateType: z.string().optional(), addressStatementTimestamp: z.number().int().optional()}); export const dLClassDetails = z.object({dlClass: z.string().optional(), validFromDate: z.number().int().optional(), validToDate: z.number().int().optional(), additionalCodes: z.string().optional(), restrictions: z.array(z.string()).optional()}); export const governmentComparisonResults = z.object({paternalLastNameValid: z.boolean().optional(), maternalLastNameValid: z.boolean().optional(), firstNameValid: z.boolean().optional(), curpValid: z.boolean().optional(), ineCurpValid: z.boolean().optional(), ocrValid: z.boolean().optional(), claveDeElectorValid: z.boolean().optional(), numeroEmisionCredencialValid: z.boolean().optional(), registrationDateValid: z.boolean().optional(), issueDateValid: z.boolean().optional()}); export const ocrDataConfidence = z.object({birthDateConfidence: z.number().gte(0).lte(1).optional(), nameConfidence: z.number().gte(0).lte(1).optional(), nameNativeScriptConfidence: z.number().gte(0).lte(1).optional(), firstNameNativeScriptConfidence: z.number().gte(0).lte(1).optional(), paternalLastNameNativeScriptConfidence: z.number().gte(0).lte(1).optional(), maternalLastNameNativeScriptConfidence: z.number().gte(0).lte(1).optional(), givenNameConfidence: z.number().gte(0).lte(1).optional(), firstNameConfidence: z.number().gte(0).lte(1).optional(), middleNameConfidence: z.number().gte(0).lte(1).optional(), nameSuffixConfidence: z.number().gte(0).lte(1).optional(), mothersSurnameConfidence: z.number().gte(0).lte(1).optional(), fathersSurnameConfidence: z.number().gte(0).lte(1).optional(), nickNameConfidence: z.number().gte(0).lte(1).optional(), fullNameMrzConfidence: z.number().gte(0).lte(1).optional(), mothersNameConfidence: z.number().gte(0).lte(1).optional(), fathersNameConfidence: z.number().gte(0).lte(1).optional(), mothersIdNumberConfidence: z.number().gte(0).lte(1).optional(), fathersIdNumberConfidence: z.number().gte(0).lte(1).optional(), spouseNameConfidence: z.number().gte(0).lte(1).optional(), birthNameConfidence: z.number().gte(0).lte(1).optional(), addressConfidence: z.number().gte(0).lte(1).optional(), streetConfidence: z.number().gte(0).lte(1).optional(), colonyConfidence: z.number().gte(0).lte(1).optional(), postalCodeConfidence: z.number().gte(0).lte(1).optional(), cityConfidence: z.number().gte(0).lte(1).optional(), stateConfidence: z.number().gte(0).lte(1).optional(), districtConfidence: z.number().gte(0).lte(1).optional(), stateCodeConfidence: z.number().gte(0).lte(1).optional(), countryCodeConfidence: z.number().gte(0).lte(1).optional(), genderConfidence: z.number().gte(0).lte(1).optional(), issueDateConfidence: z.number().gte(0).lte(1).optional(), expirationDateConfidence: z.number().gte(0).lte(1).optional(), issuedAtConfidence: z.number().gte(0).lte(1).optional(), expireAtConfidence: z.number().gte(0).lte(1).optional(), issuingAuthorityConfidence: z.number().gte(0).lte(1).optional(), mrz1Confidence: z.number().gte(0).lte(1).optional(), mrz2Confidence: z.number().gte(0).lte(1).optional(), mrz3Confidence: z.number().gte(0).lte(1).optional(), mrzFullConfidence: z.number().gte(0).lte(1).optional(), documentNumberConfidence: z.number().gte(0).lte(1).optional(), backNumberConfidence: z.number().gte(0).lte(1).optional(), personalNumberConfidence: z.number().gte(0).lte(1).optional(), nationalNumberConfidence: z.number().gte(0).lte(1).optional(), claveDeElectorConfidence: z.number().gte(0).lte(1).optional(), numeroEmisionCredencialConfidence: z.number().gte(0).lte(1).optional(), curpConfidence: z.number().gte(0).lte(1).optional(), nueConfidence: z.number().gte(0).lte(1).optional(), registrationDateConfidence: z.number().gte(0).lte(1).optional(), heightConfidence: z.number().gte(0).lte(1).optional(), birthPlaceConfidence: z.number().gte(0).lte(1).optional(), bloodTypeConfidence: z.number().gte(0).lte(1).optional(), eyeColorConfidence: z.number().gte(0).lte(1).optional(), classesConfidence: z.number().gte(0).lte(1).optional(), condConfidence: z.number().gte(0).lte(1).optional(), mentionsConfidence: z.number().gte(0).lte(1).optional(), refNumberConfidence: z.number().gte(0).lte(1).optional(), weightConfidence: z.number().gte(0).lte(1).optional(), hairConfidence: z.number().gte(0).lte(1).optional(), restrictionsConfidence: z.number().gte(0).lte(1).optional(), nationalityConfidence: z.number().gte(0).lte(1).optional(), nationalityMrzConfidence: z.number().gte(0).lte(1).optional(), nationalityAlpha3Confidence: z.number().gte(0).lte(1).optional(), maritalStatusConfidence: z.number().gte(0).lte(1).optional(), raceConfidence: z.number().gte(0).lte(1).optional(), taxIdNumberConfidence: z.number().gte(0).lte(1).optional(), jurisdictionCodeConfidence: z.number().gte(0).lte(1).optional()}); export const additionalDocumentAttemptDto = z.object({status: z.enum(["SUCCESS", "VALIDATION_ERROR", "FAIL"]).optional(), attemptTimestamp: z.number().int().optional(), imagesUrl: z.array(z.string()).optional(), attemptType: z.enum(["POA", "DOCUMENT_CAPTURE"]).optional(), documentType: z.string()}); export const ocrDataResponse = z.object({name: nameBean.optional(), address: z.string().optional(), addressFields: addressBean.optional(), fullAddress: z.boolean().optional(), invalidAddress: z.boolean().optional(), checkedAddress: z.string().optional(), checkedAddressBean: addressBean.optional(), exteriorNumber: z.string().optional(), interiorNumber: z.string().optional(), addressFromStatement: z.string().optional(), addressFieldsFromStatement: addressBean.optional(), invalidAddressFromStatement: z.boolean().optional(), addressStatementEmissionDate: z.number().int().optional(), documentType: z.enum(["a1", "aggm", "apg", "energieAg", "cre", "aforeAzteca", "amd", "amicsa", "att", "axtel", "bancoppel", "bancoAzteca", "banorte", "bbva", "cab", "caev", "capa", "cea", "cfe", "citibanamex", "cmapa", "cmapaGrande", "cmapas", "cmas", "cmasBlue", "comapa", "comapaRed", "coppel", "dapa", "dhc", "drenaje", "ecogas", "engie", "gasNatural", "h", "hsbc", "inbursa", "infonavit", "interapas", "isagas", "izzi", "jad", "japam", "japama", "japami", "japay", "jiapaz", "jmas", "jras", "jumapac", "jumapam", "lerdo", "liverpool", "mas", "megacable", "naturgy", "oapas", "odapas", "ooapas", "opdm", "oroapa", "sacmex", "sacmexCdmx", "santander", "sapa", "sapal", "sapamuy", "sapasa", "sapasma", "scotiabank", "seapal", "siapa", "simapag", "simapas", "simas", "smapa", "smapac", "smapam", "smapas", "spectrum", "stori", "sura", "tam", "telcel", "telmex", "totalplay", "veolia", "victoria", "wizz", "asylumSeeker", "refugeeId", "refugeeStatus", "ute", "telkom", "tmobile", "verizon", "xfinity", "aforeCoppel", "americanExpress", "ap", "telnor", "wellsFargo", "otherPoa"]).optional(), addressStatementTimestamps: z.array(addressStatementDate).optional(), poaName: z.string().optional(), typeOfId: z.enum(["Unknown", "Passport", "Visa", "DriversLicense", "IdentificationCard", "Permit", "Currency", "ResidenceDocument", "TravelDocument", "BirthCertificate", "VehicleRegistration", "Other", "WeaponLicense", "TribalIdentification", "VoterIdentification", "Military", "TaxIdentification", "FederalID", "MedicalCard"]).optional(), documentFrontSubtype: z.string().optional(), documentBackSubtype: z.string().optional(), issueFront: z.number().int().optional(), issueBack: z.number().int().optional(), birthDate: z.number().int().optional(), gender: z.enum(["M", "F", "X"]).max(1).optional(), claveDeElector: z.string().min(18).max(18).optional(), curp: z.string().min(18).max(18).optional(), numeroEmisionCredencial: z.string().min(2).max(2).optional(), cic: z.string().min(9).max(9).optional(), ocr: z.string().min(13).max(13).optional(), documentNumber: z.string().optional(), documentNumberSource: z.enum(["FORM", "OCR"]).optional(), personalNumber: z.string().optional(), nationalNumber: z.string().optional(), refNumber: z.string().optional(), taxIdNumber: z.string().optional(), nue: z.string().optional(), externalId: z.string().optional(), issuedAt: z.string().optional(), expireAt: z.string().optional(), expirationDate: z.number().int().optional(), issueDate: z.number().int().optional(), registrationDate: z.number().int().optional(), dlClassDetails: z.array(dLClassDetails).optional(), issuingCountry: z.string().optional(), issuingState: z.string().optional(), birthPlace: z.string().optional(), issuingAuthority: z.string().optional(), height: z.string().optional(), weight: z.string().optional(), eyeColor: z.string().optional(), hairColor: z.string().optional(), religion: z.string().optional(), bloodType: z.string().optional(), maritalStatus: z.string().optional(), nationality: z.string().optional(), race: z.string().optional(), nationalityMrz: z.string().optional(), nationalityAlpha3: z.string().optional(), governmentComparisonResults: governmentComparisonResults.optional(), notExtracted: z.number().int().optional(), notExtractedDetails: z.array(z.string()).optional(), classes: z.string().optional(), cond: z.string().optional(), mentions: z.string().optional(), restrictions: z.string().optional(), mrz1: z.string().optional(), mrz2: z.string().optional(), mrz3: z.string().optional(), fullNameMrz: z.string().optional(), documentNumberCheckDigit: z.string().optional(), dateOfBirthCheckDigit: z.string().optional(), expirationDateCheckDigit: z.string().optional(), barcodeRawData: z.string().optional(), fathersName: z.string().optional(), mothersName: z.string().optional(), fathersIdNumber: z.string().optional(), mothersIdNumber: z.string().optional(), spouseName: z.string().optional(), federalRevenueNumber: z.string().optional(), originDocumentId: z.string().optional(), driversLicenseCategory: z.string().optional(), controlNumber: z.string().optional(), renach: z.string().optional(), additionalAttrs: z.array(z.enum(["DOCUMENTO_INFANTIL", "IDADE_PRE_ESCOLAR", "MENOR_DE_ANOS", "NAO_ASSINA", "EM_FASE_DE_ALFABETIZACAO", "IMPOSSIBILITADO_DE_ASSINAR", "LIMITED_TERM", "FEDERAL_LIMITS_APPLY", "PERMISO_PARA_TRABAJAR", "EXTRANJERO", "INDIA_DIGITAL_VID", "VETERAN", "MOTORCYCLE_LICENSE", "NON_DOMICILED", "COMMERCIAL_LICENSE", "RESIDENTE", "MIGRANTE", "TEMPORAL", "VISITANTE"])).optional(), ocrDataConfidence: ocrDataConfidence.optional(), additionalDocumentAttempts: z.array(additionalDocumentAttemptDto).optional(), documentSubmissionMethod: z.enum(["CAPTURED_DOCUMENT", "UPLOADED_FILE", "IMPORTED_CREDENTIAL"]).optional(), credentialsProvider: z.enum(["APPLE", "GOOGLE", "DIGILOCKER", "SAMSUNG"]).optional()}); export const deviceInfoResponse = z.object({ipAddress: z.string().max(15).optional(), hash: z.string().max(64).optional(), deviceType: z.enum(["IOS", "ANDROID", "WEBAPP"]).optional(), osVersion: z.string().optional(), deviceModel: z.string().optional(), sdkVersion: z.string().optional(), browser: z.string().optional(), hasLiedBrowser: z.boolean().optional(), longitude: z.number().optional(), latitude: z.number().optional(), location: z.string().optional(), getmAdminArea: z.string().optional(), getmSubAdminArea: z.string().optional(), getmLocality: z.string().optional(), getmSubLocality: z.string().optional(), getmThoroughfare: z.string().optional(), getmSubThoroughfare: z.string().optional(), getmPostalCode: z.string().optional(), getmCountryCode: z.string().optional(), getmCountryName: z.string().optional(), hostingApp: z.string().optional()}); export const authBridgeOtpCode = z.object({otpCodeRequested: z.boolean().optional(), mobile: z.string().optional(), status: z.string().optional()}); export const otpResponse = z.object({authBridge: authBridgeOtpCode.optional()}); export const govermentValidationResponseObject = z.union([z.object({valid: z.boolean().optional(), statusCode: z.number().int().optional(), governmentValidation: governmentValidation.optional(), errorDescription: z.string().optional()}), z.object({valid: z.boolean().optional(), statusCode: z.number().int().optional(), registralSituation: registralSituation.optional(), governmentValidation: governmentValidation.optional(), curpCecobanValidation: curpCecobanValidation.optional(), customFields: z.record(z.string(), z.string()).optional(), ocrData: ocrDataResponse.optional(), deviceInfo: deviceInfoResponse.optional(), ineTransactionId: z.string().optional(), errorDescription: z.string().optional(), fallbackCalled: z.boolean().optional(), otpResponse: otpResponse.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 }; /** * Process government validation * * POST /omni/process/government-validation */ export const createApiOmniProcessGovernmentValidation = async (args: CreateApiOmniProcessGovernmentValidationArgs, options?: CreateApiOmniProcessGovernmentValidationOptions) => { const {baseUrl = "https://demo-api.incodesmile.com", fetch: fetchFn = fetch, ApiKeyAuth, IncodeHardwareIdAuth} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") if (args.fallbackEnabled != null) query.append("fallbackEnabled", String(args.fallbackEnabled)) if (args.scrapingMethod != null) query.append("scrapingMethod", String(args.scrapingMethod)) if (args.scrapingV2 != null) query.append("scrapingV2", String(args.scrapingV2)) if (args.scrapingV3 != null) query.append("scrapingV3", String(args.scrapingV3)) if (args.telcel != null) query.append("telcel", String(args.telcel)) if (args.interviewId != null) query.append("interviewId", String(args.interviewId)) if (args.countryCode != null) query.append("countryCode", String(args.countryCode)) 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/process/government-validation${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "POST", headers, body: JSON.stringify(args.body)}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(govermentValidationResponseObject, await res.json()) };