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