import {z} from 'zod' export type Token = string; export type TerminalModel = {tid?: string | undefined, partial_approval_capable?: string | undefined, cardholder_presence?: string | undefined, card_presence?: string | undefined, channel?: string | undefined, processing_type?: string | undefined, pin_present?: string | undefined, special_condition_indicator?: ('UNSPECIFIED' | 'CRYPTOCURRENCY_PURCHASE' | 'QUASI_CASH' | 'DEBT_PAYMENT' | 'CENTRAL_BANK_DIGITAL_CURRENCY_PURCHASE' | 'STABLECOIN_PURCHASE' | 'BLOCKCHAIN_NATIVE_TOKEN_PURCHASE' | 'NON_FUNGIBLE_TOKEN_PURCHASE') | undefined}; export type TransactionCardAcceptor = {mid?: string | undefined, mcc?: string | undefined, name?: string | undefined, address?: string | undefined, city?: string | undefined, state?: string | undefined, postal_code?: string | undefined, country_code?: string | undefined, poi?: TerminalModel | undefined}; export type PindebitRefundEvent = {card_token: Token, card_acceptor?: TransactionCardAcceptor | undefined}; export type CreateApiSimulationsCardtransactionsPindebitRefundArgs = {body: PindebitRefundEvent}; export type CreateApiSimulationsCardtransactionsPindebitRefundOptions = {baseUrl?: string | undefined, fetch?: typeof fetch | undefined}; export const response = z.object({code: z.string(), memo: z.string(), additional_information: z.string().optional()}); export const currencyConversion = z.object({original_amount: z.number().optional(), conversion_rate: z.number().optional(), original_currency_code: z.string().optional()}); export const networkFeeModel = z.object({type: z.enum(["ISSUER_FEE", "SWITCH_FEE", "PINDEBIT_ASSOC_FEE", "ACQUIRER_FEE", "INTERCHANGE_FEE", "CUR_CONV_CARDHOLDER_FEE", "CUR_CONV_ISSUER_FEE", "CROSS_BORDER_ISSUER_FEE"]).optional(), amount: z.number().optional(), credit_debit: z.enum(["C", "D"]).optional()}); export const flex = z.object({action: z.enum(["inquiry", "advice"]).optional(), eligible: z.string().optional(), eligible_products: z.array(z.string()).optional(), secondary_credential_identifier: z.string().optional(), selected_product: z.string().optional()}); export const networkFraudView = z.object({transaction_risk_score: z.number().int().optional(), transaction_risk_score_reason_code: z.string().optional(), transaction_risk_score_reason_description: z.string().optional(), account_risk_score: z.string().optional(), account_risk_score_reason_code: z.string().optional()}); export const fraudView = z.object({network: networkFraudView.optional()}); export const terminalModel = z.object({tid: z.string().optional(), partial_approval_capable: z.string().optional(), cardholder_presence: z.string().optional(), card_presence: z.string().optional(), channel: z.string().optional(), processing_type: z.string().optional(), pin_present: z.string().optional(), special_condition_indicator: z.enum(["UNSPECIFIED", "CRYPTOCURRENCY_PURCHASE", "QUASI_CASH", "DEBT_PAYMENT", "CENTRAL_BANK_DIGITAL_CURRENCY_PURCHASE", "STABLECOIN_PURCHASE", "BLOCKCHAIN_NATIVE_TOKEN_PURCHASE", "NON_FUNGIBLE_TOKEN_PURCHASE"]).optional()}); export const transactionCardAcceptor = z.object({mid: z.string().min(2).max(15).optional(), mcc: z.string().max(5).optional(), name: z.string().max(255).optional(), address: z.string().optional(), city: z.string().optional(), state: z.string().max(2).optional(), postal_code: z.string().max(10).optional(), country_code: z.string().max(40).optional(), poi: terminalModel.optional()}); export const accountFundingRequest = z.object({first_name: z.string(), last_name: z.string().optional(), receiver_name: z.string().optional(), funding_source: z.enum(["CREDIT", "DEBIT", "PREPAID", "DEPOSIT_ACCOUNT", "CASH", "MOBILE_MONEY_ACCOUNT", "NON_VISA_CREDIT", "CHECK", "ACH"]), receiver_account_type: z.enum(["OTHER", "RTN_BANK_ACCOUNT", "IBAN", "CARD_ACCOUNT", "EMAIL", "PHONE_NUMBER", "BANK_ACCOUNT_NUMBER_AND_BANK_IDENTIFICATION_CODE", "WALLET_ID", "SOCIAL_NETWORK_ID"]), transaction_purpose: z.string().optional(), transaction_type: z.enum(["ACCOUNT_TO_ACCOUNT", "PERSON_TO_PERSON", "WALLET_TRANSFER", "MONEY_TRANSFER_BY_BANK", "BUSINESS_TO_BUSINESS", "DISBURSEMENT", "GOVERNMENT_DISBURSEMENT", "GAMBLING_PAYOUT", "LOYALTY", "MERCHANT_DISBURSEMENT", "ONLINE_GAMBLING_PAYOUT", "PENSION_DISBURSEMENT", "PREPAID_LOADS", "CARD_BILL_PAYMENT", "BILL_PAYMENT", "CASH_CLAIM", "CASH_IN", "CASH_OUT", "MOBILE_AIR_TIME_PAYMENT", "MONEY_TRANSFER_BY_MERCHANT", "FACE_TO_FACE_MERCHANT_PAYMENT", "GOVERNMENT_PAYMENT", "PAYMENTS_GOODS_SERVICES", "FUNDS_TRANSFER", "VISA_ACCEPT", "GENERAL_BUSINESS_TO_BUSINESS_TRANSFER", "BUSINESS_TO_BUSINESS_TRANSFER", "CASH_DEPOSIT", "PURCHASE_REPAYMENT", "AFT_OR_OCT_ELIGIBILITY", "CONSUMER_BILL_PAYMENT", "REQUEST_TO_PAY", "LIQUID_ASSET", "FAST_REFUND", "GAMING_PAYMENT"])}); export const realTimeFeeAssessment = z.object({domestic_enabled: z.boolean().optional(), international_enabled: z.boolean().optional(), transaction_type: z.string().optional()}); export const fee = z.object({active: z.boolean(), amount: z.number(), created_time: z.string(), currency_code: z.string(), last_modified_time: z.string(), name: z.string(), real_time_assessment: realTimeFeeAssessment.optional(), tags: z.string().optional(), token: z.string()}); export const feeDetail = z.object({fee: fee, memo: z.string().min(1).max(99).optional(), tags: z.string().max(255).optional(), token: z.string().min(1).max(36), transaction_token: z.string()}); export const gatewayLogModel = z.object({duration: z.number().int().optional(), message: z.string(), order_number: z.string(), timed_out: z.boolean().optional(), transaction_id: z.string()}); export const fundingSourceModel = z.object({active: z.boolean(), created_time: z.string(), is_default_account: z.boolean(), last_modified_time: z.string(), token: z.string(), type: z.string()}); export const cardholderAddressResponse = z.object({active: z.boolean().optional(), address_1: z.string().max(255), address_2: z.string().max(255).optional(), business_token: z.string().min(1).max(36).optional(), city: z.string().max(40), country: z.string().min(1).max(40), created_time: z.string(), first_name: z.string().max(40), is_default_address: z.boolean().optional(), last_modified_time: z.string(), last_name: z.string().max(40), phone: z.string().max(255).optional(), postal_code: z.string().max(10), state: z.string().max(2), token: z.string().min(1).max(36), user_token: z.string().min(1).max(36).optional(), zip: z.string().max(10)}); export const funding = z.object({amount: z.number().optional(), gateway_log: gatewayLogModel.optional(), source: fundingSourceModel, source_address: cardholderAddressResponse.optional()}); export const cardholderBalance: z.ZodType = z.object({available_balance: z.number(), balances: z.record(z.string(), z.lazy(() => cardholderBalance)), cached_balance: z.number(), credit_balance: z.number(), currency_code: z.string(), impacted_amount: z.number().optional(), last_updated_time: z.string(), ledger_balance: z.number(), pending_credits: z.number()}); export const jitFundingApi = z.object({amount: z.number().gte(0), balances: z.record(z.string(), cardholderBalance).optional(), business_token: z.string().max(36).optional(), decline_reason: z.enum(["INVALID_AMOUNT", "INSUFFICIENT_FUNDS", "TRANSACTION_NOT_PERMITTED", "SUSPECTED_FRAUD", "AMOUNT_LIMIT_EXCEEDED", "TRANSACTION_COUNT_LIMIT_EXCEEDED", "DUPLICATE_TRANSACTION", "INVALID_MERCHANT", "INVALID_CARD", "NO_CREDIT_ACCOUNT", "EXPIRED_CARD", "NO_CHECKING_ACCOUNT", "NO_SAVINGS_ACCOUNT", "STOP_PAYMENT", "REVOCATION_AUTHORIZATION_ORDER", "REVOCATION_ALL_AUTHORIZATION_ORDER", "SOFT_DECLINE_AUTHENTICATION_REQUIRED", "CLOSED_ACCOUNT", "SOFT_DECLINE_PIN_REQUIRED", "CARD_NOT_ACTIVE", "CARDHOLDER_NOT_ACTIVE"]).optional(), incremental_authorization_jit_funding_tokens: z.array(z.string()).optional(), memo: z.string().max(99).optional(), method: z.enum(["pgfs.authorization", "pgfs.authorization.clearing", "pgfs.authorization.advice", "pgfs.authorization.incremental", "pgfs.authorization.capture", "pgfs.authorization.reversal", "pgfs.authorization.cashback", "pgfs.balanceinquiry", "pgfs.auth_plus_capture", "pgfs.refund", "pgfs.refund.authorization", "pgfs.refund.authorization.reversal", "pgfs.refund.authorization.clearing", "pgfs.force_capture", "pgfs.authorization.capture.chargeback", "pgfs.authorization.capture.chargeback.reversal", "pgfs.pindebit", "pgfs.pindebit.chargeback", "pgfs.pindebit.chargeback.reversal", "pgfs.pindebit.cashback", "pgfs.pindebit.refund", "pgfs.pindebit.authorization", "pgfs.pindebit.authorization.clearing", "pgfs.pindebit.authorization.reversal", "pgfs.pindebit.atm.withdrawal", "pgfs.pindebit.balanceinquiry", "pgfs.pindebit.quasi.cash", "pgfs.dispute.credit", "pgfs.dispute.debit", "pgfs.directdeposit.credit", "pgfs.directdeposit.debit", "pgfs.directdeposit.credit.reversal", "pgfs.directdeposit.debit.reversal", "pgfs.adjustment.credit", "pgfs.adjustment.debit", "pgfs.auth_plus_capture.standin", "pgfs.authorization.standin", "pgfs.network.load", "pgfs.original.credit.authorization", "pgfs.original.credit.auth_plus_capture", "pgfs.original.credit.authorization.clearing", "pgfs.original.credit.authorization.reversal", "pgfs.billpayment", "pgfs.billpayment.capture", "pgfs.billpayment.reversal", "pgfs.atm.withdrawal", "pgfs.atm.clearing.withdrawal", "pgfs.authorization.quasi.cash", "pgfs.authorization.clearing.quasi.cash", "pgfs.authorization.account_verification", "pgfs.product.inquiry"]), original_jit_funding_token: z.string().max(36).optional(), tags: z.string().max(255).optional(), token: z.string().max(36), user_token: z.string().max(36)}); export const gpaResponse = z.object({amount: z.number(), created_time: z.string(), currency_code: z.string(), fees: z.array(feeDetail).optional(), funding: funding, funding_source_address_token: z.string().optional(), funding_source_token: z.string(), gateway_message: z.string().optional(), gateway_token: z.number().int().optional(), jit_funding: jitFundingApi.optional(), last_modified_time: z.string(), memo: z.string().optional(), response: response, state: z.string(), tags: z.string().optional(), token: z.string(), transaction_token: z.string(), user_token: z.string().optional()}); export const originalCredit = z.object({funding_source: z.enum(["CREDIT", "DEBIT", "PREPAID", "DEPOSIT_ACCOUNT", "CASH", "MOBILE_MONEY_ACCOUNT", "NON_VISA_CREDIT", "CHECK", "ACH"]).optional(), transaction_type: z.enum(["ACCOUNT_TO_ACCOUNT", "PERSON_TO_PERSON", "WALLET_TRANSFER", "MONEY_TRANSFER_BY_BANK", "BUSINESS_TO_BUSINESS", "DISBURSEMENT", "GOVERNMENT_DISBURSEMENT", "GAMBLING_PAYOUT", "LOYALTY", "MERCHANT_DISBURSEMENT", "ONLINE_GAMBLING_PAYOUT", "PENSION_DISBURSEMENT", "PREPAID_LOADS", "CARD_BILL_PAYMENT", "BILL_PAYMENT", "CASH_CLAIM", "CASH_IN", "CASH_OUT", "MOBILE_AIR_TIME_PAYMENT", "MONEY_TRANSFER_BY_MERCHANT", "FACE_TO_FACE_MERCHANT_PAYMENT", "GOVERNMENT_PAYMENT", "PAYMENTS_GOODS_SERVICES", "FUNDS_TRANSFER", "VISA_ACCEPT", "GENERAL_BUSINESS_TO_BUSINESS_TRANSFER", "BUSINESS_TO_BUSINESS_TRANSFER", "CASH_DEPOSIT", "PURCHASE_REPAYMENT", "AFT_OR_OCT_ELIGIBILITY", "CONSUMER_BILL_PAYMENT", "REQUEST_TO_PAY", "GAMING_PAYMENT"]).optional(), sender_account_type: z.enum(["OTHER", "RTN_BANK_ACCOUNT", "IBAN", "CARD_ACCOUNT", "EMAIL", "PHONE_NUMBER", "BANK_ACCOUNT_NUMBER_AND_BANK_IDENTIFICATION_CODE", "WALLET_ID", "SOCIAL_NETWORK_ID"]).optional(), sender_name: z.string().optional(), screening_score: z.string().optional()}); export const aniInformation = z.object({first_name: z.string().optional(), last_name: z.string().optional(), middle_name: z.string().optional()}); export const accountNameVerificationModel = z.object({on_file: aniInformation.optional(), request: aniInformation.optional(), request_type: z.enum(["SENDER", "RECEIVER"]).optional(), response: response.optional()}); export const avsInformation = z.object({postal_code: z.string().optional(), street_address: z.string().optional()}); export const addressVerificationModel = z.object({on_file: avsInformation.optional(), request: avsInformation.optional(), response: response.optional()}); export const transactionModel = z.object({type: z.enum(["gpa.credit", "gpa.credit.pending", "gpa.credit.pending.reversal", "gpa.credit.reversal", "gpa.credit.networkload", "gpa.credit.networkload.reversal", "gpa.debit.networkload", "gpa.debit", "gpa.debit.pending", "gpa.debit.pending.reversal", "gpa.grant", "gpa.credit.issueroperator", "gpa.debit.issueroperator", "gpa.credit.chargeback", "gpa.credit.chargeback.reversal", "gpa.credit.billpayment", "gpa.credit.authorization.billpayment", "gpa.credit.authorization.billpayment.reversal", "authorization", "authorization.advice", "authorization.reversal", "authorization.clearing", "authorization.reversal.issuerexpiration", "dispute.credit", "dispute.debit", "authorization.clearing.chargeback", "authorization.clearing.chargeback.reversal", "refund", "pindebit.atm.withdrawal", "pindebit.balanceinquiry", "pindebit.cashback", "pindebit.checkavs", "pindebit", "programreserve.credit", "programreserve.debit", "fee.charge.pending", "fee.charge", "fee.charge.refund", "fee.charge.reversal", "funds.expire", "reward.earn", "transfer.peer", "transfer.fee", "account.funding.authorization", "account.funding.authorization.reversal", "account.funding.authorization.clearing", "account.funding.auth_plus_capture", "account.funding.auth_plus_capture.reversal", "account.credit", "account.debit", "balanceinquiry", "authorization.atm.withdrawal", "authorization.pin.change", "authorization.pin.unblock", "authorization.clearing.atm.withdrawal", "authorization.cashback", "authorization.clearing.cashback", "transfer.program", "authorization.quasi.cash", "authorization.clearing.quasi.cash", "authorization.incremental", "gpa.credit.authorization", "gpa.credit.authorization.reversal", "gpa.debit.authorization", "gpa.debit.reversal", "original.credit.authorization", "original.credit.authorization.reversal", "original.credit.authorization.clearing", "original.credit.auth_plus_capture", "original.credit.auth_plus_capture.reversal", "refund.authorization", "refund.authorization.advice", "refund.authorization.clearing", "refund.authorization.reversal", "token.activation-request", "token.advice", "pindebit.authorization", "pindebit.authorization.clearing", "pindebit.authorization.reversal", "pindebit.authorization.reversal.issuerexpiration", "authorization.standin", "authorization.clearing.chargeback.completed", "authorization.clearing.chargeback.provisional.credit", "authorization.clearing.chargeback.provisional.debit", "authorization.clearing.chargeback.writeoff", "directdeposit.credit", "directdeposit.credit.pending", "directdeposit.credit.reject", "directdeposit.credit.pending.reversal", "directdeposit.credit.reversal", "directdeposit.debit", "directdeposit.debit.pending", "directdeposit.debit.reject", "directdeposit.debit.reversal", "pin.change.reversal", "pin.change.reversal.advice", "directdeposit.debit.pending.reversal", "pindebit.chargeback", "pindebit.chargeback.completed", "pindebit.chargeback.provisional.credit", "pindebit.chargeback.provisional.debit", "pindebit.chargeback.reversal", "pindebit.chargeback.writeoff", "pindebit.pin.change", "pindebit.pin.unblock", "pindebit.credit.adjustment", "pindebit.quasicash", "pindebit.quasi.cash", "pindebit.refund", "pindebit.refund.reversal", "pindebit.reversal", "pindebit.transfer", "pushtocard.debit", "pushtocard.reversal", "credit.adjustment", "debit.adjustment", "pin.change.via.api", "product.inquiry", "transit.offer", "transfer.from.checking.hold", "transfer.from.checking.clear", "transfer.to.checking.open", "transfer.to.checking.clear", "transfer.to.savings.open", "transfer.to.savings.clear", "transfer.from.savings.hold", "transfer.from.savings.clear", "fps.debit.hold", "fps.debit.clear", "fps.debit.hold.reverse", "fps.debit.clear.reverse", "fps.credit.open", "fps.credit.clear", "fps.credit.open.reverse", "fps.credit.clear.reverse", "interest.posting.clear", "interest.posting.clear.reverse", "interest.posting.adjustment", "unknown"]), state: z.enum(["CLEARED", "COMPLETION", "DECLINED", "ERROR", "PENDING"]), token: z.string().min(1).max(36), user_token: z.string().max(36).optional(), card_token: z.string().max(36).optional(), response: response.optional(), created_time: z.string().optional(), user_transaction_time: z.string().optional(), settlement_date: z.string().optional(), amount: z.number(), amount_to_be_released: z.number().optional(), anticipated_amount: z.number().optional(), cash_back_amount: z.number().optional(), request_amount: z.number().optional(), gpa: z.object({ledger_balance: z.number().optional(), available_balance: z.number().optional(), impacted_amount: z.number().optional()}).optional(), currency_code: z.string().optional(), currency_conversion: currencyConversion.optional(), preceding_related_transaction_token: z.string().optional(), network: z.enum(["VISA", "MASTERCARD", "PULSE", "DISCOVER"]).optional(), subnetwork: z.enum(["VISANET", "VISANETDEBIT", "VISAINTERLINK", "VISAPLUS", "MAESTRO", "CIRRUS", "MASTERCARDDEBIT"]).optional(), acquirer_fee_amount: z.number().optional(), fees: z.array(networkFeeModel).optional(), flex: flex.optional(), fraud: fraudView.optional(), card_acceptor: transactionCardAcceptor.optional(), account_funding: accountFundingRequest.optional(), gpa_order: gpaResponse.optional(), original_credit: originalCredit.optional(), account_name_verification: accountNameVerificationModel.optional(), address_verification: addressVerificationModel.optional()}); export const cardTransactionResponse = z.object({transaction: transactionModel.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 }; /** * Simulate PIN-debit refund * * POST /simulations/cardtransactions/pindebit.refund */ export const createApiSimulationsCardtransactionsPindebitRefund = async (args: CreateApiSimulationsCardtransactionsPindebitRefundArgs, options?: CreateApiSimulationsCardtransactionsPindebitRefundOptions) => { const {baseUrl = "https://sandbox-api.marqeta.com/v3", fetch: fetchFn = fetch} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") const url = `${baseUrl.replace(/\/+$/, '')}/simulations/cardtransactions/pindebit.refund${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(cardTransactionResponse, await res.json()) };