import {z} from 'zod' export type PaymentType = 'ae_aani' | 'ae_uaefts' | 'ae_uaefts_rtgs' | 'ar_coelsa' | 'ar_mep' | 'ar_transfer_30' | 'au_becs' | 'au_npp' | 'au_rits' | 'bacs' | 'becs' | 'bh_benefit' | 'bh_fawri' | 'bh_rtgs' | 'br_pix' | 'br_str' | 'br_ted' | 'ca_eft' | 'ca_lynx' | 'ca_rtr' | 'cbs_transfer' | 'ch_sct' | 'ch_sic' | 'ch_sip' | 'chaps' | 'cl_cca' | 'cl_lbtr' | 'cl_tef' | 'co_ach' | 'co_bre_b' | 'co_cud' | 'fps' | 'icelandic_exp' | 'id_bifast' | 'id_birtgs' | 'id_sknbi' | 'internal_transfer' | 'ke_eft' | 'ke_pesalink' | 'ke_rtgs' | 'mx_spei' | 'my_duitnow' | 'my_ibg' | 'my_rentas' | 'no_nbo' | 'no_nics' | 'no_nics_instant' | 'osko' | 'ph_instapay' | 'ph_pddts' | 'ph_philpass' | 'pl_elixir' | 'pl_express_elixir' | 'pl_sorbnet' | 'rits' | 'ro_regis' | 'ro_sent' | 'ro_sent_instant' | 'sa_sarie' | 'sa_sarie_instant' | 'sa_sarie_rtgs' | 'se_bankgirot' | 'se_rix' | 'se_rix_instant' | 'sepa' | 'sepa_instant' | 'sepa_urgent' | 'sg_giro' | 'sg_meps' | 'sg_paynow' | 'swift' | 'swift_fi_to_fi' | 'target2' | 'target2_fi_to_fi' | 'th_bahtnet' | 'th_nitmx' | 'th_promptpay' | 'tl_ips' | 'tl_rtimor_ach' | 'tl_rtimor_rtgs' | 'treasury' | 'us_ach' | 'us_fednow' | 'us_rtp' | 'us_wire' | 'za_eft' | 'za_rpp' | 'za_samos'; export type GetApiIncomingPaymentsArgs = {limit?: number | undefined, starting_after?: string | undefined, sort_order?: ('asc' | 'desc') | undefined, start_date?: string | undefined, end_date?: string | undefined, connected_account_id?: string | undefined, type?: PaymentType | undefined, direction?: ('credit' | 'debit') | undefined, status?: ('received' | 'returned' | 'pending_return' | 'pending_confirmation' | 'confirmed' | 'rejected') | undefined, start_value_date?: string | undefined, end_value_date?: string | undefined, amount_from?: number | undefined, amount_to?: number | undefined, currency?: string | undefined, mandate_reference?: string | undefined, file_id?: string | undefined, reconciliation_status?: ('reconciled' | 'partially_reconciled' | 'unreconciled' | 'excluded') | undefined, aggregation_reference?: string | undefined, direct_debit_mandate_id?: string | undefined, internal_account_id?: string | undefined, uetr?: string | undefined, settlement_method?: ('cover' | 'instructed_agent' | 'instructing_agent') | undefined, 'cbs_data.transaction_id'?: string | undefined, 'validation.type'?: ('internal_account_is_active' | 'direct_debit_mandate_is_active' | 'liquidity_screening' | 'sanctions_screening' | 'risk_screening' | 'limits_screening' | 'mambu_authorization') | undefined, 'validation.status'?: ('queued' | 'in_progress' | 'successful' | 'failed' | 'pending_investigation' | 'pending_retry' | 'canceled' | 'technical_error') | undefined}; export type GetApiIncomingPaymentsOptions = {baseUrl?: string | undefined, sec0?: string | undefined, fetch?: typeof fetch | undefined}; export const paymentType = z.enum(["ae_aani", "ae_uaefts", "ae_uaefts_rtgs", "ar_coelsa", "ar_mep", "ar_transfer_30", "au_becs", "au_npp", "au_rits", "bacs", "becs", "bh_benefit", "bh_fawri", "bh_rtgs", "br_pix", "br_str", "br_ted", "ca_eft", "ca_lynx", "ca_rtr", "cbs_transfer", "ch_sct", "ch_sic", "ch_sip", "chaps", "cl_cca", "cl_lbtr", "cl_tef", "co_ach", "co_bre_b", "co_cud", "fps", "icelandic_exp", "id_bifast", "id_birtgs", "id_sknbi", "internal_transfer", "ke_eft", "ke_pesalink", "ke_rtgs", "mx_spei", "my_duitnow", "my_ibg", "my_rentas", "no_nbo", "no_nics", "no_nics_instant", "osko", "ph_instapay", "ph_pddts", "ph_philpass", "pl_elixir", "pl_express_elixir", "pl_sorbnet", "rits", "ro_regis", "ro_sent", "ro_sent_instant", "sa_sarie", "sa_sarie_instant", "sa_sarie_rtgs", "se_bankgirot", "se_rix", "se_rix_instant", "sepa", "sepa_instant", "sepa_urgent", "sg_giro", "sg_meps", "sg_paynow", "swift", "swift_fi_to_fi", "target2", "target2_fi_to_fi", "th_bahtnet", "th_nitmx", "th_promptpay", "tl_ips", "tl_rtimor_ach", "tl_rtimor_rtgs", "treasury", "us_ach", "us_fednow", "us_rtp", "us_wire", "za_eft", "za_rpp", "za_samos"]); export const incomingPaymentAddress = z.object({line_1: z.string().optional(), line_2: z.string().optional(), building_number: z.string().optional(), street_name: z.string().optional(), postal_code: z.string().optional(), region_state: z.string().optional(), city: z.string().optional(), country: z.string().optional(), department: z.string().nullable().optional(), sub_department: z.string().nullable().optional(), building_name: z.string().nullable().optional(), floor: z.string().nullable().optional(), postal_box: z.string().nullable().optional(), room: z.string().nullable().optional(), city_location_name: z.string().nullable().optional(), district_name: z.string().nullable().optional()}); export const commonAddress = z.object({line_1: z.string().optional(), line_2: z.string().optional(), building_number: z.string().optional(), street_name: z.string().optional(), postal_code: z.string().optional(), region_state: z.string().optional(), city: z.string().optional(), country: z.string().optional(), department: z.string().nullable().optional(), sub_department: z.string().nullable().optional(), building_name: z.string().nullable().optional(), floor: z.string().nullable().optional(), postal_box: z.string().nullable().optional(), room: z.string().nullable().optional(), city_location_name: z.string().nullable().optional(), district_name: z.string().nullable().optional()}); export const organizationIdentificationOthersType = z.enum(["bank_identification", "central_bank_identification", "clearing_house_identification", "company_incorporation_number", "company_identification", "customer_number", "duns_number", "employee_number", "global_location_number", "siren", "siret", "tax_number", "telephone_number", "business_domain_identification", "other_identification", "unknown"]); export const organizationIdentification = z.object({legal_entity_identifier: z.string().optional(), business_identification_code: z.string().optional(), default_other_identifier_type: organizationIdentificationOthersType.optional(), others: z.array(z.object({type: organizationIdentificationOthersType, value: z.string()})).optional()}); export const privateIdentificationOtherIdentificationType = z.enum(["alien_registration_number", "passport_number", "customer_identification_number", "drivers_license_number", "employee_identification_number", "national_identity_number", "social_security_number", "telephone_number", "tax_identification_number", "person_commercial_identification"]); export const privateIdentification = z.object({birth_date: z.string().optional(), birth_city: z.string().max(35).optional(), birth_country: z.string().max(2).optional(), other: z.object({identification: z.string().max(35).optional(), identification_type: privateIdentificationOtherIdentificationType.optional(), custom_identification_type: z.string().max(35).optional(), identification_issuer: z.string().max(35).optional()}).optional()}); export const incomingPaymentOriginatingAccount = z.object({account_number: z.string().optional(), bank_code: z.string(), fi_bank_code: z.string().optional(), holder_name: z.string(), holder_address: incomingPaymentAddress.optional(), bank_name: z.string().optional(), bank_address: commonAddress.optional(), creditor_identifier: z.string(), organization_identification: organizationIdentification.optional(), private_identification: privateIdentification.optional()}); export const incomingPaymentReceivingAccount = z.object({account_number: z.string().optional(), bank_code: z.string(), fi_bank_code: z.string().optional(), holder_name: z.string(), holder_address: incomingPaymentAddress.optional(), bank_name: z.string().optional(), bank_address: commonAddress.optional(), organization_identification: organizationIdentification.optional(), private_identification: privateIdentification.optional()}); export const incomingPaymentUltimateOriginator = z.object({holder_name: z.string().optional(), holder_address: commonAddress.optional(), organization_identification: organizationIdentification.optional(), private_identification: privateIdentification.optional()}); export const incomingPaymentUltimateReceiver = z.object({holder_name: z.string().optional(), holder_address: commonAddress.optional(), organization_identification: organizationIdentification.optional(), private_identification: privateIdentification.optional()}); export const incomingPaymentCreditorReferenceType = z.object({code: z.enum(["dispatch_advice", "foreign_exchange_deal_reference", "purchase_order", "related_payment_instruction", "remittance_advice_message", "structured_communication_reference", "other"]).optional(), issuer: z.string().optional()}); export const incomingPaymentCreditorReferenceInformation = z.object({type: incomingPaymentCreditorReferenceType.optional(), reference: z.string().optional()}); export const incomingPaymentReferredDocumentType = z.object({code: z.enum(["commercial_invoice", "credit_note_related_to_financial_adjustment", "contract", "credit_note", "debit_note", "dispatch_advice", "debit_note_related_to_financial_adjustment", "hire_invoice", "invoice_signed", "metered_service_invoice", "proforma_invoice", "purchase_order", "quotation", "self_billed_invoice", "seller_presentment", "time_sheet", "usage_report", "account_receivable_open_item", "bill_of_lading", "commercial_contract", "statement_of_account", "trade_services_utility_transaction", "voucher", "other"]).optional(), issuer: z.string().optional()}); export const incomingPaymentReferredDocumentInformation = z.object({type: incomingPaymentReferredDocumentType.optional(), number: z.string().optional(), related_date: z.string().optional()}); export const incomingPaymentStructuredReference = z.array(z.object({creditor_reference_information: incomingPaymentCreditorReferenceInformation.optional(), referred_document_information: z.array(incomingPaymentReferredDocumentInformation).optional(), invoicer: z.object({name: z.string().optional()}).optional(), invoicee: z.object({name: z.string().optional()}).optional(), additional_remittance_info: z.array(z.string()).optional()})); export const paymentOrderDirectDebitSequenceType = z.enum(["first", "recurring", "final", "one_off"]).nullable(); export const commonAgentOtherIdentification = z.object({identification: z.string().max(35).optional(), identification_type: organizationIdentificationOthersType.optional(), custom_identification_type: z.string().max(35).optional(), identification_issuer: z.string().max(35).optional()}); export const commonAgentFinancialInstitutionIdentification = z.object({swift_code: z.string().optional(), bank_code: z.string().optional(), bank_code_format: z.enum(["bic", "uk_sorting_code", "us_aba_routing_number", "tokenized", "other"]).optional(), name: z.string().max(140).optional(), legal_entity_identifier: z.string().optional(), postal_address: commonAddress.optional(), other: commonAgentOtherIdentification.optional()}); export const commonIntermediaryAgents = z.array(z.object({financial_institution_identification: commonAgentFinancialInstitutionIdentification, account_number: z.string().optional(), account_number_format: z.string().optional(), organization_identification: z.object({name: z.string().optional(), bank_code: z.string().optional(), legal_entity_identifier: z.string().optional(), other: z.string().optional()}).optional(), postal_address: commonAddress.optional()})); export const commonPreviousInstructingAgents = z.array(z.object({financial_institution_identification: commonAgentFinancialInstitutionIdentification, account_number: z.string().optional(), account_number_format: z.string().optional(), organization_identification: z.object({name: z.string().optional(), bank_code: z.string().optional(), legal_entity_identifier: z.string().optional(), other: z.string().optional()}).optional(), postal_address: commonAddress.optional()})); export const commonPaymentValidationResult = z.object({payment_validation_rule_id: z.string(), status: z.enum(["in_progress", "successful", "failed"]), validations: z.array(z.array(z.object({type: z.enum(["internal_account_is_active", "direct_debit_mandate_is_active", "liquidity_screening", "sanctions_screening", "risk_screening", "limits_screening", "mambu_authorization"]), status: z.enum(["queued", "in_progress", "successful", "failed", "canceled", "pending_investigation", "pending_retry", "technical_error"]), status_details: z.string().optional(), resource_id: z.string().optional(), resource_url: z.string().optional(), mode: z.enum(["pre_built", "custom"]).optional(), last_updated_at: z.string().optional(), retry_details: z.object({attempt_count: z.number().int().gte(1).lte(5).optional(), max_attempts: z.number().int().gte(1).lte(5).optional(), next_attempt_at: z.string().nullable().optional(), final_action: z.enum(["approve_payment", "cancel_payment", "confirm_payment", "reject_payment", "set_payment_to_received", "set_payment_to_pending_confirmation", "suspend_payment"]).optional()}).nullable().optional()})))}); export const commonCbsTransaction = z.object({id: z.string().optional(), type: z.enum(["deposit", "withdrawal", "disbursement", "repayment", "adjustment"]).optional(), context: z.enum(["deposit", "suspense", "disbursement", "repayment"]).optional(), payment_validation_type: z.enum(["internal_account_is_active", "direct_debit_mandate_is_active", "liquidity_screening", "sanctions_screening", "risk_screening", "limits_screening", "mambu_authorization"]).optional(), account_id: z.string().optional(), authorization_id: z.string().optional(), external_id: z.string().optional(), channel: z.string().optional(), booked_at: z.string().optional()}); export const commonCbsData = z.object({transaction_id: z.string().optional(), authorization_id: z.string().optional(), transactions: z.array(commonCbsTransaction).optional()}); export const incomingPaymentDetails = z.object({id: z.string(), status: z.string(), status_details: z.string(), object: z.string(), idempotency_key: z.string(), bank_data: z.object({file_id: z.string(), message_id: z.string(), transaction_id: z.string(), end_to_end_id: z.string()}), reconciliation_status: z.enum(["partially_reconciled", "reconciled", "unreconciled", "excluded"]), initiated_at: z.string(), reconciled_amount: z.number().int().gte(0), created_at: z.string(), type: paymentType, direction: z.literal("credit"), amount: z.number().int().gte(0), currency: z.literal("EUR"), connected_account_id: z.string(), originating_account: incomingPaymentOriginatingAccount, receiving_account: incomingPaymentReceivingAccount, ultimate_originator: incomingPaymentUltimateOriginator.optional(), ultimate_receiver: incomingPaymentUltimateReceiver.optional(), receiving_account_id: z.string(), reference: z.string().max(140), structured_reference: incomingPaymentStructuredReference.optional(), value_date: z.string(), requested_execution_date: z.string(), purpose: z.string().optional(), category_purpose_code: z.string().optional(), uetr: z.string().optional(), direct_debit_mandate: z.object({reference: z.string().max(35), signature_date: z.string(), last_debit_collection_date: z.string().nullable().optional(), expiry_date: z.string().nullable().optional(), type: z.enum(["sepa_core", "sepa_b2b", "bacs_debit"]), sequence: z.enum(["one_off", "recurring"]).optional(), frequency: z.enum(["one_off", "recurring"]).optional()}).nullable(), direct_debit_mandate_id: z.string(), direct_debit_sequence_type: paymentOrderDirectDebitSequenceType, intermediary_agents: commonIntermediaryAgents.optional(), previous_instructing_agents: commonPreviousInstructingAgents.optional(), routing_instruction: z.string().optional(), payment_validation: z.object({status: z.enum(["in_progress", "successful", "failed"]), validation_results: z.array(commonPaymentValidationResult)}).optional(), cbs_data: commonCbsData.optional(), instructing_agent: z.string().optional(), instructed_agent: z.string().optional(), settlement_method: z.string().optional(), instructing_settlement_agent: z.string().optional(), instructed_settlement_agent: z.string().optional(), fee_option: z.string().optional(), fi_to_fi_option: z.enum(["advi", "core", "cover"]).optional(), related_payment_id: z.string().optional(), related_payment_type: z.string().optional(), related_payment: z.object({}).optional(), metadata: z.object({})}); export const incomingPaymentSearchResult = z.object({records: z.array(incomingPaymentDetails)}); 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 }; /** * List incoming payments * * GET /incoming_payments */ export const getApiIncomingPayments = async (args: GetApiIncomingPaymentsArgs, options?: GetApiIncomingPaymentsOptions) => { const {baseUrl = "https://sandbox.numeral.io/v1", fetch: fetchFn = fetch, sec0} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.limit != null) query.append("limit", String(args.limit)) if (args.starting_after != null) query.append("starting_after", String(args.starting_after)) if (args.sort_order != null) query.append("sort_order", String(args.sort_order)) if (args.start_date != null) query.append("start_date", String(args.start_date)) if (args.end_date != null) query.append("end_date", String(args.end_date)) if (args.connected_account_id != null) query.append("connected_account_id", String(args.connected_account_id)) if (args.type != null) query.append("type", String(args.type)) if (args.direction != null) query.append("direction", String(args.direction)) if (args.status != null) query.append("status", String(args.status)) if (args.start_value_date != null) query.append("start_value_date", String(args.start_value_date)) if (args.end_value_date != null) query.append("end_value_date", String(args.end_value_date)) if (args.amount_from != null) query.append("amount_from", String(args.amount_from)) if (args.amount_to != null) query.append("amount_to", String(args.amount_to)) if (args.currency != null) query.append("currency", String(args.currency)) if (args.mandate_reference != null) query.append("mandate_reference", String(args.mandate_reference)) if (args.file_id != null) query.append("file_id", String(args.file_id)) if (args.reconciliation_status != null) query.append("reconciliation_status", String(args.reconciliation_status)) if (args.aggregation_reference != null) query.append("aggregation_reference", String(args.aggregation_reference)) if (args.direct_debit_mandate_id != null) query.append("direct_debit_mandate_id", String(args.direct_debit_mandate_id)) if (args.internal_account_id != null) query.append("internal_account_id", String(args.internal_account_id)) if (args.uetr != null) query.append("uetr", String(args.uetr)) if (args.settlement_method != null) query.append("settlement_method", String(args.settlement_method)) if (args['cbs_data.transaction_id'] != null) query.append("cbs_data.transaction_id", String(args['cbs_data.transaction_id'])) if (args['validation.type'] != null) query.append("validation.type", String(args['validation.type'])) if (args['validation.status'] != null) query.append("validation.status", String(args['validation.status'])) if (sec0 !== undefined) headers.set("x-api-key", sec0) const url = `${baseUrl.replace(/\/+$/, '')}/incoming_payments${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(incomingPaymentSearchResult, await res.json()) };