Skip to content

Built for people who want to own their automations. Join the waitlist for an invite.

Package listing

@kody/plaid

src/institutions.ts

93 lines · 2.5 KB · TypeScript
import {
	asStringArray,
	DEFAULT_COUNTRY_CODES,
	normalizeInstitution,
	plaidRequest,
	requireString,
	type PlaidAuthInput,
} from './plaid-core.ts'

export type ListInstitutionsInput = PlaidAuthInput & {
	count?: number
	offset?: number
	countryCodes?: string[]
}

/**
 * Page institutions (`/institutions/get`). Client id + secret only — no Item
 * access token and no bank login.
 */
export async function listInstitutions(input: ListInstitutionsInput = {}) {
	const count = input.count == null ? 10 : Number(input.count)
	if (!Number.isFinite(count) || count < 1 || count > 500) {
		throw new Error('count must be between 1 and 500.')
	}
	const offset = input.offset == null ? 0 : Number(input.offset)
	if (!Number.isFinite(offset) || offset < 0) {
		throw new Error('offset must be a non-negative number.')
	}
	const data = await plaidRequest({
		...input,
		path: '/institutions/get',
		body: {
			count,
			offset,
			country_codes: asStringArray(input.countryCodes, DEFAULT_COUNTRY_CODES),
		},
	})
	return {
		institutions: Array.isArray(data?.institutions)
			? data.institutions.map(normalizeInstitution)
			: [],
		total: typeof data?.total === 'number' ? data.total : null,
		request_id: data?.request_id ?? null,
	}
}

export type GetInstitutionInput = PlaidAuthInput & {
	institutionId?: string
	countryCodes?: string[]
}

/** Get one institution (`/institutions/get_by_id`). */
export async function getInstitution(input: GetInstitutionInput = {}) {
	const data = await plaidRequest({
		...input,
		path: '/institutions/get_by_id',
		body: {
			institution_id: requireString(input.institutionId, 'institutionId'),
			country_codes: asStringArray(input.countryCodes, DEFAULT_COUNTRY_CODES),
		},
	})
	return {
		institution: normalizeInstitution(data?.institution),
		request_id: data?.request_id ?? null,
	}
}

export type SearchInstitutionsInput = PlaidAuthInput & {
	query?: string
	products?: string[]
	countryCodes?: string[]
}

/** Search institutions by name (`/institutions/search`). */
export async function searchInstitutions(input: SearchInstitutionsInput = {}) {
	const data = await plaidRequest({
		...input,
		path: '/institutions/search',
		body: {
			query: requireString(input.query, 'query'),
			products: input.products?.length ? input.products : ['transactions'],
			country_codes: asStringArray(input.countryCodes, DEFAULT_COUNTRY_CODES),
		},
	})
	return {
		institutions: Array.isArray(data?.institutions)
			? data.institutions.map(normalizeInstitution)
			: [],
		request_id: data?.request_id ?? null,
	}
}

export default listInstitutions