import {z} from 'zod' export type GetApiV1KycSubmissionsSubmissionIdArgs = {submissionId: string}; export type GetApiV1KycSubmissionsSubmissionIdOptions = {baseUrl?: string | undefined, BearerAuth?: string | undefined, fetch?: typeof fetch | undefined}; export const typesDate = z.object({}); export const typesOptionalTypesDate = z.object({Val: typesDate.optional(), NotNull: z.boolean().optional()}); export const kycRequiredInfoAddress = z.object({country: z.string().optional(), postCode: z.string().optional(), town: z.string().optional(), street: z.string().optional(), subStreet: z.string().optional(), state: z.string().optional(), stateCode: z.string().optional(), buildingName: z.string().optional(), flatNumber: z.string().optional(), buildingNumber: z.string().optional()}); export const kycRequiredInfoLocation = z.object({latitude: z.string().optional(), longitude: z.string().optional()}); export const kycInfoApplicantInfo = z.object({firstName: z.string().optional(), lastName: z.string().optional(), dob: typesOptionalTypesDate.optional(), companyName: z.string().optional(), registrationNumber: z.string().optional(), registrationDate: typesOptionalTypesDate.optional(), taxId: z.string().optional(), accountType: z.string().optional(), address: kycRequiredInfoAddress.optional(), bvn: z.string().optional(), entityType: z.string().optional(), nationality: z.string().optional(), phone: z.string().optional(), email: z.string().optional(), postalAddress: z.string().optional(), ssn: z.string().optional(), tin: z.string().optional(), cpf: z.string().optional(), website: z.string().optional(), location: kycRequiredInfoLocation.optional(), residenceCountry: z.string().optional(), companyDescription: z.string().optional(), birthCountry: z.string().optional()}); export const dueReflectFieldDescriptor: z.ZodType = z.object({key: z.string().optional(), type: z.string().optional(), oneOf: z.array(z.string()).optional(), required: z.boolean().optional(), requiredIf: z.string().optional(), excludedUnless: z.string().optional(), fields: z.array(z.lazy(() => dueReflectFieldDescriptor)).optional()}); export const kycDocumentKYCDocumentRequirement = z.object({type: z.string().optional(), variants: z.array(z.string()).optional(), issuingCountries: z.array(z.string()).optional()}); export const kycDocumentKYCDocumentRequirementSet = z.object({category: z.string().optional(), oneOf: z.array(kycDocumentKYCDocumentRequirement).optional(), maxAgeDays: z.number().int().optional()}); export const kycQuestionnaireRequiredCondition = z.object({id: z.string().optional(), value: z.string().optional()}); export const kycQuestionnaireKYCQuestionnaireQuestionText = z.object({format: z.string().optional(), type: z.string()}); export const kycQuestionnaireKYCQuestionnaireQuestionNumber = z.object({min: z.number().optional(), max: z.number().optional(), type: z.string()}); export const kycQuestionnaireKYCQuestionnaireQuestionChoiceOption = z.object({id: z.string().optional(), label: z.string().optional()}); export const kycQuestionnaireKYCQuestionnaireQuestionChoice = z.object({options: z.array(kycQuestionnaireKYCQuestionnaireQuestionChoiceOption).optional(), type: z.string()}); export const kycQuestionnaireKYCQuestionnaireQuestionMultipleChoice = z.object({options: z.array(kycQuestionnaireKYCQuestionnaireQuestionChoiceOption).optional(), min: z.number().int().optional(), max: z.number().int().optional(), type: z.string()}); export const kycQuestionnaireKYCQuestionnaireQuestionBoolean = z.object({type: z.string()}); export const kycQuestionnaireKYCQuestionnaireQuestionDate = z.object({from: z.string().optional(), to: z.string().optional(), type: z.string()}); export const kycQuestionnaireKYCQuestionnaireQuestionTime = z.object({from: z.string().optional(), to: z.string().optional(), type: z.string()}); export const kycQuestionnaireKYCQuestionnaireQuestionDateTime = z.object({from: z.string().optional(), to: z.string().optional(), type: z.string()}); export const kycQuestionnaireKYCQuestionnaireQuestionAccountCategory = z.object({options: z.array(kycQuestionnaireKYCQuestionnaireQuestionChoiceOption).optional(), resourceURL: z.string().optional(), type: z.string()}); export const kycQuestionnaireKYCQuestionnaireQuestionMultipleCountries = z.object({options: z.array(kycQuestionnaireKYCQuestionnaireQuestionChoiceOption).optional(), min: z.number().int().optional(), max: z.number().int().optional(), resourceURL: z.string().optional(), type: z.string()}); export const kycQuestionnaireKYCQuestionnaireQuestionFiles = z.object({max: z.number().int().optional(), type: z.string()}); export const kycQuestionnaireQuestion = z.object({id: z.string().optional(), title: z.string().optional(), description: z.string().optional(), requiredWhen: kycQuestionnaireRequiredCondition.optional(), schema: z.discriminatedUnion("type", [kycQuestionnaireKYCQuestionnaireQuestionText, kycQuestionnaireKYCQuestionnaireQuestionNumber, kycQuestionnaireKYCQuestionnaireQuestionChoice, kycQuestionnaireKYCQuestionnaireQuestionMultipleChoice, kycQuestionnaireKYCQuestionnaireQuestionBoolean, kycQuestionnaireKYCQuestionnaireQuestionDate, kycQuestionnaireKYCQuestionnaireQuestionTime, kycQuestionnaireKYCQuestionnaireQuestionDateTime, kycQuestionnaireKYCQuestionnaireQuestionAccountCategory, kycQuestionnaireKYCQuestionnaireQuestionMultipleCountries, kycQuestionnaireKYCQuestionnaireQuestionFiles]).optional()}); export const kycQuestionnaireQuestionnaireTemplate = z.object({templateId: z.string().optional(), questions: z.array(kycQuestionnaireQuestion).optional()}); export const kycEntitiesAgreementRequirement = z.object({documentSetId: z.string().optional(), consentText: z.string().optional()}); export const kycEntitiesExternalCheckRequirement = z.object({type: z.string().optional()}); export const kycEntitiesBeneficiariesRequirement = z.object({minTotalShare: z.string().optional(), minBeneficiariesByRole: z.record(z.string(), z.number().int()).optional()}); export const kycEntitiesRequirementsSchemaStatic = z.object({info: z.array(dueReflectFieldDescriptor).optional(), documents: z.array(kycDocumentKYCDocumentRequirementSet).optional(), questionnaires: z.array(kycQuestionnaireQuestionnaireTemplate).optional(), agreements: z.array(kycEntitiesAgreementRequirement).optional(), externalChecks: z.array(kycEntitiesExternalCheckRequirement).optional(), beneficiaries: kycEntitiesBeneficiariesRequirement.optional(), kind: z.string()}); export const kycEntitiesRequirementsSchemaOneOf: z.ZodType = z.object({oneOf: z.array(z.discriminatedUnion("kind", [kycEntitiesRequirementsSchemaStatic, z.lazy(() => kycEntitiesRequirementsSchemaConditional), z.lazy(() => kycEntitiesRequirementsSchemaOneOf)])).optional(), kind: z.string()}); export const kycEntitiesRequirementsSchemaConditional: z.ZodType = z.object({if: z.discriminatedUnion("kind", [kycEntitiesRequirementsSchemaStatic, z.lazy(() => kycEntitiesRequirementsSchemaConditional), kycEntitiesRequirementsSchemaOneOf]).optional(), then: z.discriminatedUnion("kind", [kycEntitiesRequirementsSchemaStatic, z.lazy(() => kycEntitiesRequirementsSchemaConditional), kycEntitiesRequirementsSchemaOneOf]).optional(), kind: z.string()}); export const transfersModelsV2DocumentSet = z.object({id: z.string().optional(), links: z.record(z.string(), z.string()).optional()}); export const kycEntitiesAgreement = z.object({documentSet: transfersModelsV2DocumentSet.optional(), acceptedAt: z.string().optional()}); export const kycEntitiesExternalCheck = z.object({id: z.string().optional(), type: z.string().optional(), status: z.string().optional(), externalId: z.string().optional()}); export const kycDocumentKYCDocument = z.object({filename: z.string().optional(), type: z.string().optional(), variant: z.string().optional(), issuingCountry: z.string().optional(), uploadedAt: z.string().optional(), expiresAt: typesOptionalTypesDate.optional()}); export const kycQuestionnaireAnswer = z.object({id: z.string().optional(), value: z.array(z.string()).optional()}); export const kycQuestionnaireQuestionnaireAnswered = z.object({id: z.string().optional(), templateId: z.string().optional(), answers: z.array(kycQuestionnaireAnswer).optional()}); export const kycEntitiesBeneficiary = z.object({applicantId: z.string().optional(), roles: z.array(z.string()).optional(), shareSize: z.string().optional()}); export const kycEntitiesSubject = z.object({Value: z.object({}).optional()}); export const kycEntitiesSubmission = z.object({id: z.string().optional(), ownerId: z.string().optional(), applicantId: z.string().optional(), status: z.string().optional(), info: kycInfoApplicantInfo.optional(), requirements: z.array(z.discriminatedUnion("kind", [kycEntitiesRequirementsSchemaStatic, kycEntitiesRequirementsSchemaConditional, kycEntitiesRequirementsSchemaOneOf])).optional(), agreements: z.array(kycEntitiesAgreement).optional(), externalChecks: z.array(kycEntitiesExternalCheck).optional(), documents: z.array(kycDocumentKYCDocument).optional(), questionnaires: z.array(kycQuestionnaireQuestionnaireAnswered).optional(), beneficiaries: z.array(kycEntitiesBeneficiary).optional(), presetCode: z.string().optional(), source: z.string().optional(), subject: kycEntitiesSubject.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 }; /** * Get submission * * GET /v1/kyc/submissions/{submissionId} */ export const getApiV1KycSubmissionsSubmissionId = async (args: GetApiV1KycSubmissionsSubmissionIdArgs, options?: GetApiV1KycSubmissionsSubmissionIdOptions) => { const {baseUrl = "https://api.sandbox.due.network", fetch: fetchFn = fetch, BearerAuth} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (BearerAuth !== undefined) headers.set('authorization', `Bearer ${BearerAuth}`) const url = `${baseUrl.replace(/\/+$/, '')}/v1/kyc/submissions/${encodeURIComponent(String(args.submissionId))}${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(kycEntitiesSubmission, await res.json()) };