import {z} from 'zod' export type CreateApiCustomersCustomerIdPaymentMethodsArgs = {customer_id: string, body: {account_id: string, country: 'AR' | 'BO' | 'BR' | 'CL' | 'CO' | 'CR' | 'EC' | 'SV' | 'GT' | 'HN' | 'MX' | 'NI' | 'PA' | 'PY' | 'PE' | 'US' | 'UY' | '', type: 'CARD' | 'ACH_ENROLLMENT' | 'NU_PAY_ENROLLMENT', workflow?: 'DIRECT' | undefined, callback_url?: string | undefined, token?: string | undefined, parent_type?: string | undefined, account_updater?: boolean | undefined, card_data?: ({number: string, expiration_month: number, expiration_year: number, security_code?: string | undefined, holder_name?: string | undefined, brand?: string | undefined, scheme?: string | undefined, soft_descriptor?: string | undefined, card_pin?: string | undefined, authentication_method?: ('FIDO2' | 'OWN_CREDENTIALS' | 'FEDERATED_ID') | undefined}) | undefined, customer_payer?: ({code?: string | undefined, organization_customer_external_id?: string | undefined, email?: string | undefined, ip_address?: string | undefined, browser_info?: ({user_agent?: string | undefined}) | undefined}) | undefined, payment_method?: ({type?: string | undefined, vault_on_success?: boolean | undefined, detail?: ({bank_transfer?: ({account_type?: ('CHECKINGS' | 'SAVINGS') | undefined, account_holder_type?: ('INDIVIDUAL' | 'ENTITY') | undefined, bank_id?: string | undefined, bank_name?: string | undefined, bank_account?: string | undefined, beneficiary_name: string, branch?: string | undefined, branch_digit?: string | undefined, routing_number: string, code?: string | undefined, reference?: string | undefined, bank_account_mask_number?: string | undefined, mandate?: ({id?: string | undefined, info?: string | undefined, received_status?: string | undefined, existing_status?: string | undefined, created_at?: string | undefined, updated_at?: string | undefined}) | undefined}) | undefined}) | undefined}) | undefined, provider_data?: ({id: string, token_source?: ('PROVIDER_API' | 'MIGRATION_FILE' | 'PROVIDER_TOKEN') | undefined, payment_method_token?: string | undefined, connection_id?: string | undefined}) | undefined, verify?: ({vault_on_success: boolean, currency?: string | undefined, metadata?: Array<{key: string, value: string}> | undefined}) | undefined, recurring_payment?: ({regular_billing?: ({label?: string | undefined, amount?: ({currency?: string | undefined, value?: number | undefined}) | undefined, interval_unit?: ('DAY' | 'WEEK' | 'MONTH' | 'YEAR') | undefined, interval_count?: number | undefined}) | undefined}) | undefined}}; export type CreateApiCustomersCustomerIdPaymentMethodsOptions = {baseUrl?: string | undefined, publicApiKey?: string | undefined, privateSecretKey?: string | undefined, fetch?: typeof fetch | undefined}; export const createApiCustomersCustomerIdPaymentMethodsResponse = z.union([z.object({idempotency_key: z.string().optional(), name: z.string().optional(), description: z.string().optional(), type: z.string().optional(), category: z.string().optional(), country: z.string().optional(), status: z.string().optional(), sub_status: z.unknown(), vaulted_token: z.string().optional(), callback_url: z.string().optional(), action: z.unknown(), redirect_url: z.string().optional(), parent_type: z.string().optional(), created_at: z.string().optional(), updated_at: z.string().optional(), card_data: z.object({iin: z.string().optional(), lfd: z.string().optional(), holder_name: z.string().optional(), expiration_month: z.number().int().optional(), expiration_year: z.number().int().optional(), number_length: z.number().int().optional(), security_code_length: z.number().int().optional(), brand: z.string().optional(), issuer: z.string().optional(), issuer_code: z.unknown(), country_code: z.string().optional(), category: z.string().optional(), type: z.string().optional(), fingerprint: z.string().optional()}).optional(), last_successfully_used: z.unknown(), last_successfully_used_at: z.unknown(), preferred: z.unknown(), verify: z.object({vault_on_success: z.boolean().optional(), payment: z.unknown()}).optional()}), z.object({idempotency_key: z.string().optional(), name: z.string().optional(), description: z.string().optional(), type: z.string().optional(), category: z.string().optional(), country: z.string().optional(), status: z.string().optional(), sub_status: z.unknown(), vaulted_token: z.string().optional(), callback_url: z.unknown(), action: z.unknown(), created_at: z.string().optional(), updated_at: z.string().optional(), card_data: z.object({iin: z.string().optional(), lfd: z.string().optional(), holder_name: z.string().optional(), expiration_month: z.number().int().optional(), expiration_year: z.number().int().optional(), number_length: z.number().int().optional(), security_code_length: z.number().int().optional(), brand: z.string().optional(), issuer: z.string().optional(), issuer_code: z.unknown(), country_code: z.string().optional(), category: z.string().optional(), type: z.string().optional(), fingerprint: z.string().optional()}).optional(), last_successfully_used: z.unknown(), last_successfully_used_at: z.unknown(), preferred: z.unknown(), verify: z.object({vault_on_success: z.boolean().optional(), currency: z.string().optional(), payment: z.object({id: z.string().optional(), account_id: z.string().optional(), description: z.string().optional(), country: z.string().optional(), status: z.string().optional(), sub_status: z.string().optional(), merchant_order_id: z.string().optional(), created_at: z.string().optional(), updated_at: z.string().optional(), amount: z.object({currency: z.string().optional(), value: z.number().int().optional(), refunded: z.number().int().optional(), captured: z.number().int().optional()}).optional(), transactions: z.array(z.object({id: z.string().optional(), type: z.string().optional(), status: z.string().optional(), response_code: z.string().optional(), response_message: z.string().optional(), category: z.string().optional(), merchant_reference: z.string().optional(), provider_data: z.object({id: z.string().optional(), transaction_id: z.string().optional(), account_id: z.string().optional(), status: z.string().optional(), sub_status: z.string().optional(), status_detail: z.string().optional(), response_message: z.string().optional(), raw_response: z.object({additionalData: z.object({"threeds2.cardEnrolled": z.string().optional()}).optional(), merchantReference: z.string().optional(), refusalReason: z.string().optional(), refusalReasonCode: z.string().optional(), resultCode: z.string().optional()}).optional(), third_party_transaction_id: z.unknown()}).optional(), created_at: z.string().optional(), updated_at: z.string().optional()})).optional(), metadata: z.array(z.object({key: z.string().optional(), value: z.string().optional()})).optional()}).optional()}).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 }; /** * Enroll Payment Method * * POST /customers/{customer_id}/payment-methods */ export const createApiCustomersCustomerIdPaymentMethods = async (args: CreateApiCustomersCustomerIdPaymentMethodsArgs, options?: CreateApiCustomersCustomerIdPaymentMethodsOptions) => { const {baseUrl = "https://api-sandbox.y.uno/v1", fetch: fetchFn = fetch, publicApiKey, privateSecretKey} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") if (publicApiKey !== undefined) headers.set("PUBLIC-API-KEY", publicApiKey) if (privateSecretKey !== undefined) headers.set("PRIVATE-SECRET-KEY", privateSecretKey) const url = `${baseUrl.replace(/\/+$/, '')}/customers/${encodeURIComponent(String(args.customer_id))}/payment-methods${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(createApiCustomersCustomerIdPaymentMethodsResponse, await res.json()) };