import {z} from 'zod' export type APIClientID = string; export type APISecret = string; export type NewUserID = string; export type ThirdPartyUserToken = string; export type UserToken = string; export type CraUserTier = 'free' | 'paid' | 'null' | null; export type PrismFirstDetectVersion = '3' | 'null' | null; export type PrismDetectVersion = '4.1' | '4' | 'null' | null; export type PrismCashScoreVersion = '4.1' | '4' | '3_lite' | '3' | 'null' | null; export type PrismExtendVersion = '4.1' | '4' | 'null' | null; export type PrismInsightsVersion = '4.1' | '4' | '3' | 'null' | null; export type PrismVersions = {firstdetect?: PrismFirstDetectVersion | undefined, detect?: PrismDetectVersion | undefined, cashscore?: PrismCashScoreVersion | undefined, extend?: PrismExtendVersion | undefined, insights?: PrismInsightsVersion | undefined} | null; export type CraPartnerInsightsUltraFicoScoreVersion = '1.0'; export type CraPartnerInsightsBureau = 'EQUIFAX' | 'EXPERIAN' | 'TRANSUNION'; export type CraPartnerInsightsBaseFicoScoreVersion = '8' | '9' | '10' | '10T'; export type CraPartnerInsightsBaseFicoScore = {bureau: CraPartnerInsightsBureau, score: number, reason_codes?: Array | undefined, reason_code_1?: (string | null) | undefined, reason_code_2?: (string | null) | undefined, reason_code_3?: (string | null) | undefined, reason_code_4?: (string | null) | undefined, did_inquiries_adversely_affect_score?: (boolean | null) | undefined, base_fico_score_version: CraPartnerInsightsBaseFicoScoreVersion}; export type CraPartnerInsightsUltraFicoScoreRequest = {ultrafico_score_version: CraPartnerInsightsUltraFicoScoreVersion, fico_scoring_request_id?: string | undefined, request_correlation_id?: string | undefined, base_fico_score: CraPartnerInsightsBaseFicoScore}; export type CraPartnerInsightsFicoInput = {fico_lender_id: string, lender_application_id: string, ultrafico_score_requests: Array} | null; export type CraCheckReportPartnerInsightsGetPartnerInsights = {prism_versions?: PrismVersions | undefined, fico?: CraPartnerInsightsFicoInput | undefined}; export type PrismVersionsDeprecated = {firstdetect?: PrismFirstDetectVersion | undefined, detect?: PrismDetectVersion | undefined, cashscore?: PrismCashScoreVersion | undefined, extend?: PrismExtendVersion | undefined, insights?: PrismInsightsVersion | undefined} | null; export type CraCheckReportPartnerInsightsGetOptions = {prism_versions?: PrismVersionsDeprecated | undefined} | null; export type CraCheckReportPartnerInsightsGetRequest = {client_id?: APIClientID | undefined, secret?: APISecret | undefined, user_id?: NewUserID | undefined, third_party_user_token?: ThirdPartyUserToken | undefined, user_token?: UserToken | undefined, user_tier?: CraUserTier | undefined, partner_insights?: CraCheckReportPartnerInsightsGetPartnerInsights | undefined, options?: CraCheckReportPartnerInsightsGetOptions | undefined}; export type CreateApiCraCheckReportPartnerInsightsGetArgs = {body: CraCheckReportPartnerInsightsGetRequest}; export type CreateApiCraCheckReportPartnerInsightsGetOptions = {baseUrl?: string | undefined, clientId?: string | undefined, secret?: string | undefined, plaidVersion?: string | undefined, fetch?: typeof fetch | undefined}; export const craPartnerInsightsUltraFicoScoreVersion = z.literal("1.0"); export const craPartnerInsightsUltraFicoScore = z.object({ultrafico_score_version: craPartnerInsightsUltraFicoScoreVersion, score: z.number().int(), negative_reason_codes: z.array(z.string()).optional(), positive_reason_codes: z.array(z.string()).optional(), reason_code_1: z.string().nullable().optional(), reason_code_2: z.string().nullable().optional(), reason_code_3: z.string().nullable().optional(), reason_code_4: z.string().nullable().optional(), positive_reason_code_1: z.string().nullable().optional(), positive_reason_code_2: z.string().nullable().optional(), positive_reason_code_3: z.string().nullable().optional(), positive_reason_code_4: z.string().nullable().optional(), did_inquiries_adversely_affect_score: z.boolean().nullable().optional()}).nullable(); export const craPartnerInsightsUltraFicoScoreResult = z.object({request_correlation_id: z.string().optional(), fico_scoring_request_id: z.string().optional(), ultrafico_score: craPartnerInsightsUltraFicoScore.optional(), error_reason: z.string().optional(), exclusion_code: z.string().nullable().optional()}); export const craPartnerInsightsFicoReportCharacteristics = z.object({num_accounts: z.number().int().nullable().optional(), avg_daily_balance_over_1_month: z.number().nullable().optional(), avg_daily_balance_over_3_months: z.number().nullable().optional(), avg_daily_balance_over_6_months: z.number().nullable().optional(), avg_daily_balance_over_12_months: z.number().nullable().optional(), days_since_earliest_tx: z.number().int().nullable().optional(), days_since_most_recent_negative_ending_balance: z.number().int().nullable().optional(), days_since_most_recent_insufficient_funds_fee_debit_tx: z.number().int().nullable().optional(), tot_number_days_with_negative_balance_over_1_month: z.number().int().nullable().optional(), tot_number_days_with_negative_balance_over_3_months: z.number().int().nullable().optional(), tot_number_days_with_negative_balance_over_6_months: z.number().int().nullable().optional(), tot_number_days_with_negative_balance_over_12_months: z.number().int().nullable().optional(), days_since_most_recent_tx: z.number().int().nullable().optional(), days_with_tx_over_1_month: z.number().int().nullable().optional(), days_with_tx_over_3_months: z.number().int().nullable().optional(), days_with_tx_over_6_months: z.number().int().nullable().optional(), days_with_tx_over_12_months: z.number().int().nullable().optional(), tot_current_balances: z.number().nullable().optional(), num_checking_accounts: z.number().int().nullable().optional(), num_money_market_accounts: z.number().int().nullable().optional(), num_savings_accounts: z.number().int().nullable().optional()}).nullable(); export const craPartnerInsightsFicoResults = z.object({lender_application_id: z.string(), ultrafico_score_results: z.array(craPartnerInsightsUltraFicoScoreResult), report_characteristics: craPartnerInsightsFicoReportCharacteristics.optional()}).nullable(); export const prismInsightsResult = z.object({}); export const prismErrorReason = z.string(); export const prismInsights = z.object({version: z.number().int(), model_version: z.string().optional(), result: prismInsightsResult.optional(), error_reason: prismErrorReason.optional()}).and(z.record(z.string(), z.unknown())).nullable(); export const prismCashScoreMetadata = z.object({max_age: z.number().int().nullable(), min_age: z.number().int().nullable(), min_age_credit: z.number().int().nullable(), min_age_debit: z.number().int().nullable(), max_age_debit: z.number().int().nullable(), max_age_credit: z.number().int().nullable(), num_trxn_credit: z.number().int().nullable(), num_trxn_debit: z.number().int().nullable(), l1m_credit_value_cnt: z.number().int().nullable(), l1m_debit_value_cnt: z.number().int().nullable()}).and(z.record(z.string(), z.unknown())); export const prismCashScore = z.object({version: z.number().int(), model_version: z.string().optional(), score: z.number().int().nullable(), reason_codes: z.array(z.string()).optional(), metadata: prismCashScoreMetadata.optional(), error_reason: prismErrorReason.optional()}).and(z.record(z.string(), z.unknown())).nullable(); export const prismExtend = z.object({model_version: z.string(), score: z.number().int().nullable(), reason_codes: z.array(z.string()).optional(), metadata: prismCashScoreMetadata.optional(), error_reason: prismErrorReason.optional()}).and(z.record(z.string(), z.unknown())).nullable(); export const prismFirstDetect = z.object({version: z.number().int(), model_version: z.string().optional(), score: z.number().int().nullable(), reason_codes: z.array(z.string()).optional(), metadata: prismCashScoreMetadata.optional(), error_reason: prismErrorReason.optional()}).and(z.record(z.string(), z.unknown())).nullable(); export const prismDetect = z.object({model_version: z.string(), score: z.number().int().nullable(), reason_codes: z.array(z.string()).optional(), metadata: prismCashScoreMetadata.optional(), error_reason: prismErrorReason.optional()}).and(z.record(z.string(), z.unknown())).nullable(); export const craPartnerInsightsPrism = z.object({insights: prismInsights.optional(), cash_score: prismCashScore.optional(), extend: prismExtend.optional(), first_detect: prismFirstDetect.optional(), detect: prismDetect.optional(), status: z.string()}).and(z.record(z.string(), z.unknown())).nullable(); export const craPartnerInsightsItemAccountMetadata = z.object({start_date: z.string().nullable(), end_date: z.string().nullable()}); export const depositoryAccountSubtype = z.enum(["checking", "savings", "hsa", "cd", "money market", "paypal", "prepaid", "cash management", "ebt", "limited purpose checking", "all"]); export const creditBankIncomeAccountType = z.literal("depository"); export const phoneNumber = z.object({data: z.string(), primary: z.boolean(), type: z.enum(["home", "work", "office", "mobile", "mobile1", "other"])}).and(z.record(z.string(), z.unknown())); export const email = z.object({data: z.string(), primary: z.boolean(), type: z.enum(["primary", "secondary", "other"])}).and(z.record(z.string(), z.unknown())); export const addressData = z.object({city: z.string().nullable(), region: z.string().nullable(), street: z.string().nullable(), postal_code: z.string().nullable(), country: z.string().nullable()}).and(z.record(z.string(), z.unknown())); export const address = z.object({data: addressData, primary: z.boolean().optional()}).and(z.record(z.string(), z.unknown())); export const owner = z.object({names: z.array(z.string()), phone_numbers: z.array(phoneNumber), emails: z.array(email), addresses: z.array(address)}).and(z.record(z.string(), z.unknown())); export const craPartnerInsightsItemAccount = z.object({account_id: z.string().optional(), mask: z.string().nullable(), metadata: craPartnerInsightsItemAccountMetadata, name: z.string(), official_name: z.string().nullable(), subtype: depositoryAccountSubtype, type: creditBankIncomeAccountType, owners: z.array(owner)}).and(z.record(z.string(), z.unknown())); export const craPartnerInsightsItem = z.object({institution_id: z.string().optional(), institution_name: z.string().optional(), item_id: z.string().optional(), accounts: z.array(craPartnerInsightsItemAccount).optional()}).and(z.record(z.string(), z.unknown())); export const craPartnerInsights = z.object({report_id: z.string().optional(), generated_time: z.string().optional(), client_report_id: z.string().nullable().optional(), fico: craPartnerInsightsFicoResults.optional(), prism: craPartnerInsightsPrism.optional(), items: z.array(craPartnerInsightsItem).optional()}).and(z.record(z.string(), z.unknown())); export const requestID = z.string(); export const checkReportWarningCode = z.enum(["IDENTITY_UNAVAILABLE", "TRANSACTIONS_UNAVAILABLE", "USER_FRAUD_ALERT"]); export const plaidErrorType = z.enum(["INVALID_REQUEST", "INVALID_RESULT", "INVALID_INPUT", "INSTITUTION_ERROR", "RATE_LIMIT_EXCEEDED", "API_ERROR", "ITEM_ERROR", "ASSET_REPORT_ERROR", "BASE_REPORT_ERROR", "RECAPTCHA_ERROR", "OAUTH_ERROR", "PAYMENT_ERROR", "BANK_TRANSFER_ERROR", "INCOME_VERIFICATION_ERROR", "MICRODEPOSITS_ERROR", "SANDBOX_ERROR", "PARTNER_ERROR", "SIGNAL_ERROR", "TRANSACTIONS_ERROR", "TRANSACTION_ERROR", "TRANSFER_ERROR", "CHECK_REPORT_ERROR", "CONSUMER_REPORT_ERROR", "USER_ERROR", "IDEMPOTENCY_ERROR", "ASSETS_ERROR", "CRA_MONITORING_ERROR", "CREDIT_PROFILE_REPORT_ERROR", "ENCOMPASS_ERROR", "ENRICH_ERROR", "FRAUD_INSIGHTS_ERROR", "FREDDIE_MAC_ERROR", "LINK_DELIVERY_ERROR", "PROFILE_ERROR", "RECURRING_TRANSACTIONS_ERROR", "STATEMENTS_ERROR", "TRANSFER_RECURRING_ERROR", "TRANSFER_REFUND_ERROR", "CRA_REPORT_ERROR", "CRA_PARTNER_INSIGHTS_ERROR"]); export const itemId = z.string(); export const cause = z.object({error_type: plaidErrorType, error_code: z.string(), error_code_reason: z.string().nullable().optional(), error_message: z.string(), display_message: z.string().nullable(), request_id: z.string().optional(), causes: z.array(z.unknown()).optional(), status: z.number().int().nullable().optional(), documentation_url: z.string().optional(), suggested_action: z.string().nullable().optional(), required_account_subtypes: z.array(z.string()).optional(), provided_account_subtypes: z.array(z.string()).optional(), item_id: itemId}).and(z.record(z.string(), z.unknown())).nullable(); export const checkReportWarning = z.object({warning_type: z.string(), warning_code: checkReportWarningCode, cause: cause}).and(z.record(z.string(), z.unknown())); export const craCheckReportPartnerInsightsGetResponse = z.object({report: craPartnerInsights.optional(), request_id: requestID, warnings: z.array(checkReportWarning).optional()}).and(z.record(z.string(), z.unknown())); 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 }; /** * Retrieve cash flow insights from partners * * POST /cra/check_report/partner_insights/get */ export const createApiCraCheckReportPartnerInsightsGet = async (args: CreateApiCraCheckReportPartnerInsightsGetArgs, options?: CreateApiCraCheckReportPartnerInsightsGetOptions) => { const {baseUrl = "https://production.plaid.com", fetch: fetchFn = fetch, clientId, secret, plaidVersion} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") if (clientId !== undefined) headers.set("PLAID-CLIENT-ID", clientId) if (secret !== undefined) headers.set("PLAID-SECRET", secret) if (plaidVersion !== undefined) headers.set("Plaid-Version", plaidVersion) const url = `${baseUrl.replace(/\/+$/, '')}/cra/check_report/partner_insights/get${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(craCheckReportPartnerInsightsGetResponse, await res.json()) };