import {z} from 'zod' export type GetApiAccountAccountIdTransactionTransactionIdArgs = {accountId: string, transactionId: string}; export type GetApiAccountAccountIdTransactionTransactionIdOptions = {baseUrl?: string | undefined, bearerAuth?: string | undefined, fetch?: typeof fetch | undefined}; export const transactionAttachmentType = z.enum(["checkImage", "receipt", "other"]); export const transactionAttachment = z.object({attachmentType: transactionAttachmentType, fileName: z.string(), url: z.string()}); export const categoryData = z.object({id: z.string(), name: z.string(), visibleForCardSpend: z.boolean(), visibleForOther: z.boolean(), visibleForReimbursements: z.boolean()}); export const transactionPartyId = z.string(); export const uTCTime = z.string(); export const mercuryCreditAccountStatementPeriodId = z.string(); export const currencyCode = z.string(); export const transactionMetadataId = z.string(); export const currencyExchangeInfo = z.object({convertedFromAmount: z.number().multipleOf(0.01), convertedFromCurrency: currencyCode, convertedToAmount: z.number().multipleOf(0.01), convertedToCurrency: currencyCode, exchangeRate: z.number().multipleOf(0.0001), feeAmount: z.number().multipleOf(0.01), feePercentage: z.number().multipleOf(0.0001), feeTransactionId: transactionMetadataId.nullable().optional()}); export const uSState = z.enum(["AL", "AK", "AZ", "AR", "CA", "CO", "CT", "DE", "DC", "FL", "GA", "HI", "ID", "IL", "IN", "IA", "KS", "KY", "LA", "ME", "MD", "MA", "MI", "MN", "MS", "MO", "MT", "NE", "NV", "NH", "NJ", "NM", "NY", "NC", "ND", "OH", "OK", "OR", "PA", "RI", "SC", "SD", "TN", "TX", "UT", "VT", "VA", "WA", "WV", "WI", "WY"]); export const addressData = z.object({address1: z.string(), address2: z.string().nullable().optional(), city: z.string(), postalCode: z.string(), state: uSState.nullable().optional()}); export const creditCardInfo = z.object({email: z.string().nullable().optional(), id: z.string(), paymentMethod: z.string()}); export const debitCardInfo = z.object({id: z.string()}); export const iSO3166Alpha2 = z.string(); export const region = z.string(); export const addressWithoutName = z.object({address1: z.string(), address2: z.string().nullable().optional(), city: z.string(), country: iSO3166Alpha2, postalCode: z.string(), region: region}); export const domesticWireRoutingInfo = z.object({accountNumber: z.string(), address: addressWithoutName.nullable().optional(), bankName: z.string().nullable().optional(), routingNumber: z.string()}); export const electronicAccountType = z.enum(["businessChecking", "businessSavings", "personalChecking", "personalSavings", "businessGeneralLedger", "personalGeneralLedger", "businessLoan", "personalLoan"]); export const electronicRoutingInfo = z.object({accountNumber: z.string(), address: addressWithoutName.nullable().optional(), bankName: z.string().nullable().optional(), electronicAccountType: electronicAccountType, routingNumber: z.string()}); export const swiftCodeData = z.object({bankCityState: z.string(), bankCountry: iSO3166Alpha2, bankName: z.string()}); export const internationalWireCorrespondentInfo = z.object({bankName: z.string().nullable().optional(), routingNumber: z.string().nullable().optional(), swiftCode: z.string().nullable().optional()}); export const internationalWireAustraliaSpecificData = z.object({bsbCode: z.string()}); export const internationalWireBrazilSpecificData = z.object({legalId: z.string()}); export const internationalWireCanadaSpecificData = z.object({bankCode: z.string(), transitNumber: z.string()}); export const internationalWireChileSpecificData = z.object({legalId: z.string()}); export const internationalWireColombiaSpecificData = z.object({legalId: z.string()}); export const swiftBankAccountType = z.enum(["checking", "savings"]); export const internationalWireDominicanRepublicSpecificData = z.object({accountType: swiftBankAccountType, legalId: z.string()}); export const internationalWireHondurasSpecificData = z.object({accountType: swiftBankAccountType, legalId: z.string()}); export const internationalWireIndiaSpecificData = z.object({ifscCode: z.string()}); export const internationalWireKazakhstanSpecificData = z.object({legalId: z.string()}); export const pakistaniLegalIdType = z.enum(["CNIC", "SNIC", "Passport", "NTN"]); export const internationalWirePakistanSpecificData = z.object({legalId: z.string(), legalIdType: pakistaniLegalIdType}); export const internationalWireParaguaySpecificData = z.object({legalId: z.string()}); export const internationalWirePhilippinesSpecificData = z.object({routingNumber: z.string()}); export const internationalWireRussiaSpecificData = z.object({inn: z.string()}); export const internationalWireSouthAfricaSpecificData = z.object({branchCode: z.string()}); export const internationalWireCountrySpecificData = z.object({australia: internationalWireAustraliaSpecificData.nullable().optional(), brazil: internationalWireBrazilSpecificData.nullable().optional(), canada: internationalWireCanadaSpecificData.nullable().optional(), chile: internationalWireChileSpecificData.nullable().optional(), colombia: internationalWireColombiaSpecificData.nullable().optional(), dominicanRepublic: internationalWireDominicanRepublicSpecificData.nullable().optional(), honduras: internationalWireHondurasSpecificData.nullable().optional(), india: internationalWireIndiaSpecificData.nullable().optional(), kazakhstan: internationalWireKazakhstanSpecificData.nullable().optional(), pakistan: internationalWirePakistanSpecificData.nullable().optional(), paraguay: internationalWireParaguaySpecificData.nullable().optional(), philippines: internationalWirePhilippinesSpecificData.nullable().optional(), russia: internationalWireRussiaSpecificData.nullable().optional(), southAfrica: internationalWireSouthAfricaSpecificData.nullable().optional()}); export const internationalWireRoutingInfo = z.object({address: addressWithoutName.nullable().optional(), bankDetails: swiftCodeData.nullable().optional(), correspondentInfo: internationalWireCorrespondentInfo.nullable().optional(), countrySpecific: internationalWireCountrySpecificData, emailAddress: z.string().nullable().optional(), iban: z.string(), phoneNumber: z.string().nullable().optional(), swiftCode: z.string()}); export const transactionMethodData = z.object({address: addressData.nullable().optional(), creditCardInfo: creditCardInfo.nullable().optional(), debitCardInfo: debitCardInfo.nullable().optional(), domesticWireRoutingInfo: domesticWireRoutingInfo.nullable().optional(), electronicRoutingInfo: electronicRoutingInfo.nullable().optional(), internationalWireRoutingInfo: internationalWireRoutingInfo.nullable().optional()}); export const glAllocation = z.object({amount: z.number().multipleOf(0.01), className: z.string().nullable().optional(), departmentName: z.string().nullable().optional(), description: z.string().nullable().optional(), glCodeName: z.string()}); export const transactionKind = z.enum(["externalTransfer", "internalTransfer", "outgoingPayment", "creditCardCredit", "creditCardTransaction", "debitCardCredit", "debitCardTransaction", "cardInternationalTransactionFee", "cardInternationalTransactionFeeRebate", "cardInternationalTransactionFeeReversal", "cardInternationalTransactionFeeRebateReversal", "incomingDomesticWire", "checkDeposit", "incomingInternationalWire", "treasuryTransfer", "currencyCloudReturn", "wireFee", "personalBankingSubscriptionFee", "billingEngineSubscriptionFee", "expenseReimbursement", "exogenousWireDrawdown", "interestPayment", "other"]); export const mercuryCategory = z.enum(["Other", "Advertising", "Airlines", "AlcoholAndBars", "BooksAndNewspaper", "CarRental", "Charity", "Clothing", "Conferences", "Education", "Electronics", "Entertainment", "FacilitiesExpenses", "Fees", "FoodDelivery", "FuelAndGas", "Gambling", "GovernmentServices", "Grocery", "GroundTransportation", "Insurance", "InternetAndTelephone", "Legal", "Lodging", "Medical", "Memberships", "OfficeSupplies", "OtherTravel", "Parking", "Political", "ProfessionalServices", "Restaurants", "Retail", "RideshareAndTaxis", "Shipping", "Software", "Taxes", "Utilities", "VehicleExpenses"]); export const transactionRelationKind = z.enum(["ProvisionalCreditReversalToMerchantRefund", "MerchantRefundToProvisionalCreditReversal", "MerchantRefundToFraudulentCharge", "FraudulentChargeToMerchantRefund", "PaymentRefundToFailedPayment", "FailedPaymentToPaymentRefund", "GiftCompensationToOriginalTransaction", "FeePaymentToOriginalTransaction", "OriginalTransactionToFeePayment", "FeePaymentToFeeRebate", "FeeRebateToFeePayment", "FeePaymentToFeeReversal", "FeeReversalToFeePayment", "FeeRebateToFeeRebateReversal", "FeeRebateReversalToFeeRebate", "TreasurySplitLiquidation", "ProvisionalCreditToOriginalCharge", "OriginalChargeToProvisionalCredit", "FeeAtmReimbursementToAtmTransaction", "AtmTransactionToFeeAtmReimbursement", "AtmTransactionToAtmReimbursementReversal", "AtmReimbursementReversalToAtmTransaction", "ReturnToOriginalTransaction", "OriginalTransactionToReturn", "ProvisionalCreditToReversal", "ReversalToProvisionalCredit", "MerchantRefundToOriginalCharge", "OriginalChargeToMerchantRefund"]); export const relatedTransactionData = z.object({accountId: transactionPartyId, amount: z.number().multipleOf(0.01), id: transactionMetadataId, relationKind: transactionRelationKind}); export const transactionStatus = z.enum(["pending", "sent", "cancelled", "failed", "reversed", "blocked"]); export const transaction = z.object({accountId: z.string(), accountingStatus: z.object({erroredAt: z.string().nullable().optional(), excludedAt: z.string().nullable().optional(), reviewedAt: z.string().nullable().optional(), status: z.enum(["pending", "reviewed", "syncing", "synced", "errored", "excluded"]), syncStartedAt: z.string().nullable().optional(), syncedAt: z.string().nullable().optional()}).nullable().optional(), amount: z.number().multipleOf(0.01), attachments: z.array(transactionAttachment), bankDescription: z.string().nullable().optional(), cardId: z.string().nullable().optional(), categoryData: categoryData.nullable().optional(), checkNumber: z.string().nullable().optional(), compliantWithReceiptPolicy: z.boolean(), counterpartyId: transactionPartyId, counterpartyName: z.string(), counterpartyNickname: z.string().nullable().optional(), createdAt: uTCTime, creditAccountPeriodId: mercuryCreditAccountStatementPeriodId.nullable().optional(), currencyExchangeInfo: currencyExchangeInfo.nullable().optional(), dashboardLink: z.string(), details: transactionMethodData.nullable().optional(), estimatedDeliveryDate: uTCTime, externalMemo: z.string().nullable().optional(), failedAt: uTCTime.nullable().optional(), feeId: transactionMetadataId.nullable().optional(), generalLedgerCodeName: z.string().nullable().optional(), glAllocations: z.array(glAllocation), hasGeneratedReceipt: z.boolean(), id: transactionMetadataId, kind: transactionKind, merchant: z.object({amount: z.number().int().gte(-9223372036854776000).lte(9223372036854776000).nullable().optional(), category: z.enum(["Other", "Advertising", "Airlines", "AlcoholAndBars", "BooksAndNewspaper", "CarRental", "Charity", "Clothing", "Conferences", "Education", "Electronics", "Entertainment", "FacilitiesExpenses", "Fees", "FoodDelivery", "FuelAndGas", "Gambling", "GovernmentServices", "Grocery", "GroundTransportation", "Insurance", "InternetAndTelephone", "Legal", "Lodging", "Medical", "Memberships", "OfficeSupplies", "OtherTravel", "Parking", "Political", "ProfessionalServices", "Restaurants", "Retail", "RideshareAndTaxis", "Shipping", "Software", "Taxes", "Utilities", "VehicleExpenses"]).nullable().optional(), categoryCode: z.string().nullable().optional(), currency: z.string().nullable().optional(), id: z.string().nullable().optional()}).nullable().optional(), mercuryCategory: mercuryCategory.nullable().optional(), note: z.string().nullable().optional(), postedAt: uTCTime.nullable().optional(), reasonForFailure: z.string().nullable().optional(), relatedTransactions: z.array(relatedTransactionData), requestId: z.string().nullable().optional(), status: transactionStatus, trackingNumber: z.string().nullable().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 transaction by ID * * GET /account/{accountId}/transaction/{transactionId} */ export const getApiAccountAccountIdTransactionTransactionId = async (args: GetApiAccountAccountIdTransactionTransactionIdArgs, options?: GetApiAccountAccountIdTransactionTransactionIdOptions) => { const {baseUrl = "https://api.mercury.com/api/v1", 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(/\/+$/, '')}/account/${encodeURIComponent(String(args.accountId))}/transaction/${encodeURIComponent(String(args.transactionId))}${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(transaction, await res.json()) };