import {z} from 'zod' export type UpdateApiTokensTokenIdCancelArgs = {'token-customer-ip-address'?: string | undefined, 'customer-initiated'?: boolean | undefined, 'token-customer-device-id'?: string | undefined, tokenId: string}; export type UpdateApiTokensTokenIdCancelOptions = {baseUrl?: string | undefined, Bearer?: string | undefined, fetch?: typeof fetch | undefined}; export const tokenOperationResultStatus = z.enum(["INVALID", "SUCCESS", "MORE_SIGNATURES_NEEDED"]); export const attachment = z.object({blobId: z.string().optional(), name: z.string().optional(), type: z.string().optional()}); export const chargeBearer = z.enum(["INVALID_CHARGE_BEARER", "CRED", "DEBT", "SHAR", "SLEV"]); export const instructionIdentification = z.string(); export const deliveryAddress = z.object({addressLine: z.array(z.string()).optional(), addressType: z.enum(["INVALID_ADDRESS_TYPE", "BUSINESS", "CORRESPONDENCE", "DELIVERYTO", "MAILTO", "POBOX", "POSTAL", "RESIDENTIAL", "STATEMENT"]).optional(), buildingNumber: z.string().optional(), country: z.string().optional(), countrySubDivision: z.array(z.string()).optional(), department: z.string().optional(), postCode: z.string().optional(), streetName: z.string().optional(), subDepartment: z.string().optional(), townName: z.string().optional()}); export const paymentContextCode = z.enum(["INVALID_PAYMENT_CONTEXT_CODE", "BILLING_GOODS_AND_SERVICES_IN_ADVANCE", "BILLING_GOODS_AND_SERVICES_IN_ARREARS", "PISP_PAYEE", "ECOMMERCE_MERCHANT_INITIATED_PAYMENT", "FACE_TO_FACE_POINT_OF_SALE", "TRANSFER_TO_SELF", "TRANSFER_TO_THIRD_PARTY"]); export const cma9BeneficiaryAccountType = z.enum(["PERSONAL", "JOINT_PERSONAL", "PERSONAL_SAVINGS_ACCOUNT", "BUSINESS", "BUSINESS_SAVINGS_ACCOUNT", "CHARITY", "COLLECTION", "CORPORATE", "GOVERNMENT", "EWALLET", "INVESTMENT", "ISA", "PREMIER", "WEALTH", "PENSION"]); export const cma9Risk = z.object({deliveryAddress: deliveryAddress.optional(), merchantCustomerIdentification: z.string().optional(), paymentContextCode: paymentContextCode.optional(), paymentPurposeCode: z.enum(["CASH", "CORT", "DVPM", "INTC", "TREA", "SUPP"]).optional(), beneficiaryAccountType: cma9BeneficiaryAccountType.optional(), contractPresentIndicator: z.string().optional(), beneficiaryPrepopulatedIndicator: z.string().optional()}); export const cma9TransferMetadata = z.object({endToEndIdentification: z.string().optional(), instructionIdentification: instructionIdentification.optional(), risk: cma9Risk.optional()}); export const nextGenPsd2TransferMetadata = z.object({creditorAgent: z.string().optional(), creditorAgentName: z.string().optional(), endToEndIdentification: z.string().optional(), remittanceInformationStructured: z.string().optional()}); export const polishApiDeliveryMode = z.enum(["INVALID_DELIVERY_MODE", "STANDARD_D2", "STANDARD_D1", "URGENT_D1", "EXPRESS_D0"]); export const polishApiTransferMetadata = z.object({deliveryMode: polishApiDeliveryMode.optional(), hold: z.boolean().optional()}); export const stetGenericIdentification = z.object({identification: z.string().optional(), issuer: z.string().optional(), schemeName: z.string().optional()}); export const stetPostalAddress = z.object({addressLine: z.array(z.string()).optional(), country: z.string().optional()}); export const stetPartyIdentification = z.object({name: z.string().optional(), organisationId: stetGenericIdentification.optional(), postalAddress: stetPostalAddress.optional(), privateId: stetGenericIdentification.optional()}); export const stetAccountIdentification = z.object({currency: z.string().optional(), other: stetGenericIdentification.optional()}); export const stetClearingSystemMemberIdentification = z.object({clearingSystemId: z.string().optional(), memberId: z.string().optional()}); export const stetPostalAddressCreditor = z.object({addressLine: z.array(z.string()).optional(), country: z.string().optional()}); export const stetFinancialInstitutionIdentification = z.object({bicFi: z.string().optional(), clearingSystemMemberId: stetClearingSystemMemberIdentification.optional(), name: z.string().optional(), postalAddress: stetPostalAddressCreditor.optional()}); export const stetBeneficiary = z.object({creditor: stetPartyIdentification.optional(), creditorAccount: stetAccountIdentification.optional(), creditorAgent: stetFinancialInstitutionIdentification.optional(), id: z.string().optional()}); export const stetPaymentTypeInformation = z.object({categoryPurpose: z.enum(["CASH", "CORT", "DVPM", "INTC", "TREA", "SUPP"]).optional(), instructionPriority: z.string().optional(), localInstrument: z.string().optional(), serviceLevel: z.string().optional()}); export const stetRegulatoryReportingCodes = z.object({regulatoryReportingCode: z.array(z.string()).optional()}); export const stetTransferMetadata = z.object({beneficiary: stetBeneficiary.optional(), debtorAgent: stetFinancialInstitutionIdentification.optional(), endToEndId: z.string().optional(), executionRule: z.string().optional(), paymentTypeInformation: stetPaymentTypeInformation.optional(), regulatoryReportingCodes: stetRegulatoryReportingCodes.optional()}); export const providerTransferMetadata = z.union([z.object({cma9TransferMetadata: cma9TransferMetadata.optional()}), z.object({nextGenPsd2TransferMetadata: nextGenPsd2TransferMetadata.optional()}), z.object({polishApiTransferMetadata: polishApiTransferMetadata.optional()}), z.object({stetTransferMetadata: stetTransferMetadata.optional()})]); export const metadata = z.object({chargeBearer: chargeBearer.optional(), providerTransferMetadata: providerTransferMetadata.optional(), purposeCode: z.enum(["CASH", "CORT", "DVPM", "INTC", "TREA", "SUPP"]).optional(), ultimateCreditor: z.string().optional(), ultimateDebtor: z.string().optional()}); export const accountIdentifierBankgiro = z.object({bankgiroNumber: z.string().optional()}); export const accountIdentifierBban = z.object({bban: z.string().optional(), clearingNumber: z.string().optional()}); export const accountIdentifierGbDomestic = z.object({accountNumber: z.string().optional(), sortCode: z.string().optional()}); export const accountIdentifierIban = z.object({iban: z.string().optional()}); export const accountIdentifierMsisdn = z.object({msisdn: z.string().optional()}); export const accountIdentifierPan = z.object({pan: z.string().optional()}); export const accountIdentifierPlusgiro = z.object({plusgiroNumber: z.string().optional()}); export const accountIdentifierToken = z.object({accountId: z.string().optional(), memberId: z.string().optional()}); export const accountIdentifier = z.union([z.object({bankgiro: accountIdentifierBankgiro}), z.object({bban: accountIdentifierBban}), z.object({gbDomestic: accountIdentifierGbDomestic}), z.object({iban: accountIdentifierIban}), z.object({msisdn: accountIdentifierMsisdn}), z.object({pan: accountIdentifierPan}), z.object({plusgiro: accountIdentifierPlusgiro.optional()}), z.object({token: accountIdentifierToken})]); export const bankId = z.string(); export const addressInfo = z.object({city: z.string().optional(), conscriptionNumber: z.string().optional(), country: z.string().optional(), district: z.string().optional(), flats: z.string().optional(), full: z.string().optional(), hamlet: z.string().optional(), houseName: z.string().optional(), houseNumber: z.string().optional(), place: z.string().optional(), postCode: z.string().optional(), province: z.string().optional(), state: z.string().optional(), street: z.string().optional(), subdistrict: z.string().optional(), suburb: z.string().optional()}); export const customerDataDebtor = z.object({address: addressInfo.optional(), legalNames: z.array(z.string())}); export const transferDebtorEndpoint = z.object({accountIdentifier: accountIdentifier, bankId: bankId.optional(), bic: z.string().optional(), customerData: customerDataDebtor.optional()}); export const customerDataCreditor = z.object({address: addressInfo.optional(), legalNames: z.array(z.string())}); export const transferDestinationType = z.enum(["UNKNOWN", "BUSINESS", "PERSONAL"]); export const transferDestinationSepa = z.object({iban: z.string(), bic: z.string().optional()}); export const transferDestinationSepaInstant = z.object({iban: z.string(), bic: z.string().optional()}); export const transferDestinationFasterPayments = z.object({accountNumber: z.string(), sortCode: z.string()}); export const transferDestinationElixir = z.object({accountNumber: z.string()}); export const eUIbanAccount = z.object({iban: z.string(), bic: z.string().optional()}); export const bbanAccount = z.object({bban: z.string(), bic: z.string().optional()}); export const clearingNumberAccount = z.object({bban: z.string(), clearingNumber: z.string().optional()}); export const sENoBankIdAccount = z.object({iban: z.string(), bban: z.string(), bic: z.string().optional(), clearingNumber: z.string().optional()}); export const transferDestinationEuDomesticNonEuro = z.union([eUIbanAccount, bbanAccount, clearingNumberAccount, sENoBankIdAccount]); export const transferDestinationEuDomesticNonEuroInstant = z.union([eUIbanAccount, bbanAccount, clearingNumberAccount, sENoBankIdAccount]); export const transferDestinationBankgiro = z.object({bankgiroNumber: z.string(), bic: z.string().optional()}); export const transferDestinationPlusgiro = z.object({plusgiroNumber: z.string(), bic: z.string().optional()}); export const transferDestinationToken = z.object({accountId: z.string().optional(), memberId: z.string().optional()}); export const transferDestinationVirtualAccount = z.object({id: z.string(), localInstrument: z.enum(["SEPA", "SEPA_INSTANT", "FASTER_PAYMENTS"])}); export const transferDestination = z.union([z.object({customerData: customerDataCreditor, type: transferDestinationType.optional(), sepa: transferDestinationSepa}), z.object({customerData: customerDataCreditor, type: transferDestinationType.optional(), sepaInstant: transferDestinationSepaInstant}), z.object({customerData: customerDataCreditor, type: transferDestinationType.optional(), fasterPayments: transferDestinationFasterPayments}), z.object({customerData: customerDataCreditor, type: transferDestinationType.optional(), elixir: transferDestinationElixir}), z.object({customerData: customerDataCreditor, type: transferDestinationType.optional(), euDomesticNonEuro: transferDestinationEuDomesticNonEuro}), z.object({customerData: customerDataCreditor, type: transferDestinationType.optional(), euDomesticNonEuroInstant: transferDestinationEuDomesticNonEuroInstant}), z.object({customerData: customerDataCreditor, type: transferDestinationType.optional(), bankgiro: transferDestinationBankgiro}), z.object({customerData: customerDataCreditor, type: transferDestinationType.optional(), plusgiro: transferDestinationPlusgiro}), z.object({customerData: customerDataCreditor, type: transferDestinationType.optional(), token: transferDestinationToken.optional()}), z.object({customerData: customerDataCreditor, type: transferDestinationType.optional(), virtualAccount: transferDestinationVirtualAccount})]); export const transferInstructions = z.object({metadata: metadata.optional(), source: transferDebtorEndpoint.optional(), transferDestinations: z.array(transferDestination)}); export const transferBody = z.object({amount: z.string().optional(), attachments: z.array(attachment).optional(), confirmFunds: z.boolean().optional(), currency: z.string(), executionDate: z.string().optional(), instructions: transferInstructions, lifetimeAmount: z.string(), remittanceReference: z.string().optional(), returnRefundAccount: z.boolean().optional()}); export const refId = z.string(); export const actingAs = z.object({displayName: z.string().optional(), refId: refId.optional(), secondaryName: z.string().optional()}); export const tokenPayloadAuthorizationMetadataEntry = z.record(z.string(), z.string()); export const type = z.enum(["INVALID", "UNKNOWN", "EMAIL", "PHONE", "DOMAIN", "BANK", "CUSTOM", "EIDAS"]); export const alias = z.object({realmId: z.string().optional(), type: type.optional(), value: z.string().optional()}); export const id = z.string(); export const tokenMember = z.object({alias: alias.optional(), id: id}); export const standingOrderBody = z.object({amount: z.string(), currency: z.string(), endDate: z.string().optional(), frequency: z.string().optional(), instructions: transferInstructions, remittanceReference: z.string().optional(), returnRefundAccount: z.boolean().optional(), startDate: z.string().optional()}); export const accessBodyResourceAccount = z.object({accountId: z.string().optional()}); export const accessBodyResourceAccountBalance = z.object({accountId: z.string().optional()}); export const accessBodyResourceFundsConfirmation = z.object({accountId: z.string().optional()}); export const accessBodyResourceAccountStandingOrders = z.object({accountId: z.string().optional()}); export const accessBodyResourceAccountTransactions = z.object({accountId: z.string().optional()}); export const accessBodyResourceTransferDestinations = z.object({accountId: z.string().optional()}); export const accessBodyResource = z.object({account: accessBodyResourceAccount.optional(), balance: accessBodyResourceAccountBalance.optional(), fundsConfirmation: accessBodyResourceFundsConfirmation.optional(), standingOrders: accessBodyResourceAccountStandingOrders.optional(), transactions: accessBodyResourceAccountTransactions.optional(), transferDestinations: accessBodyResourceTransferDestinations.optional()}); export const accessBody = z.object({resources: z.array(accessBodyResource).optional(), transactionHistoryDays: z.number().int().optional()}); export const tokenPayload = z.union([z.object({transfer: transferBody.optional(), actingAs: actingAs.optional(), authorizationMetadata: tokenPayloadAuthorizationMetadataEntry.optional(), description: z.string().optional(), effectiveAtMs: z.string().optional(), endorseUntilMs: z.string().optional(), expiresAtMs: z.string().optional(), from: tokenMember.optional(), initiatorId: z.string().optional(), issuer: tokenMember.optional(), receiptRequested: z.boolean().optional(), refId: refId.optional(), to: tokenMember.optional(), tokenRequestId: z.string().optional(), version: z.string().optional()}), z.object({standingOrder: standingOrderBody.optional(), actingAs: actingAs.optional(), authorizationMetadata: tokenPayloadAuthorizationMetadataEntry.optional(), description: z.string().optional(), effectiveAtMs: z.string().optional(), endorseUntilMs: z.string().optional(), expiresAtMs: z.string().optional(), from: tokenMember.optional(), initiatorId: z.string().optional(), issuer: tokenMember.optional(), receiptRequested: z.boolean().optional(), refId: refId.optional(), to: tokenMember.optional(), tokenRequestId: z.string().optional(), version: z.string().optional()}), z.object({access: accessBody.optional(), actingAs: actingAs.optional(), authorizationMetadata: tokenPayloadAuthorizationMetadataEntry.optional(), description: z.string().optional(), effectiveAtMs: z.string().optional(), endorseUntilMs: z.string().optional(), expiresAtMs: z.string().optional(), from: tokenMember.optional(), initiatorId: z.string().optional(), issuer: tokenMember.optional(), receiptRequested: z.boolean().optional(), refId: refId.optional(), to: tokenMember.optional(), tokenRequestId: z.string().optional(), version: z.string().optional()})]); export const tokenSignatureAction = z.enum(["INVALID", "ENDORSED", "CANCELED"]); export const signature = z.object({keyId: z.string().optional(), memberId: z.string().optional(), signature: z.string().optional()}); export const tokenSignature = z.object({action: tokenSignatureAction.optional(), signature: signature.optional()}); export const token = z.object({id: z.string().optional(), payload: tokenPayload.optional(), payloadSignatures: z.array(tokenSignature).optional(), replacedByTokenId: z.string().optional(), tokenRequestId: z.string().optional()}); export const tokenOperationResult = z.object({status: tokenOperationResultStatus.optional(), token: token.optional()}); export const cancelTokenResponse = z.object({result: tokenOperationResult.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 }; /** * Cancel a token * * PUT /tokens/{tokenId}/cancel * * Also accepts auth: BasicAuth */ export const updateApiTokensTokenIdCancel = async (args: UpdateApiTokensTokenIdCancelArgs, options?: UpdateApiTokensTokenIdCancelOptions) => { const {baseUrl = "https://api.token.io", fetch: fetchFn = fetch, Bearer} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args['token-customer-ip-address'] != null) headers.set("token-customer-ip-address", String(args['token-customer-ip-address'])) if (args['customer-initiated'] != null) headers.set("customer-initiated", String(args['customer-initiated'])) if (args['token-customer-device-id'] != null) headers.set("token-customer-device-id", String(args['token-customer-device-id'])) if (Bearer !== undefined) headers.set('authorization', `Bearer ${Bearer}`) const url = `${baseUrl.replace(/\/+$/, '')}/tokens/${encodeURIComponent(String(args.tokenId))}/cancel${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "PUT", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(cancelTokenResponse, await res.json()) };