Logos and structured metadata for the Indian fintech ecosystem — banks, UPI apps, payment gateways, neobanks, account aggregators and more.
152 entities · 16 categories · MIT licensed
Every developer building a fintech product in India needs the same thing: a logo for HDFC Bank, a symbol for PhonePe, an icon for Finvu. Today that means googling for a PNG at the wrong size, emailing brand teams who rarely reply, or buying a design subscription for a handful of marks.
There is no single structured source of truth for Indian fintech brand assets. This is that source of truth — clean SVGs plus the metadata that actually matters in fintech: IFSC prefixes, UPI handles, FIP IDs, regulatory classification.
npm install @finmarks/finmarks
# or: pnpm add @finmarks/finmarks / yarn add @finmarks/finmarksBefore shipping a logo to production: this package's MIT licence covers the code and metadata only. The logos themselves are third-party trademarks — check the brand's own guidelines before using one in your product. See Trademarks below.
This project is pre-1.0 (0.x) — minor versions may include breaking
changes. See CHANGELOG.md before upgrading.
import { getEntity, getLogoUrl, getByCategory, search } from '@finmarks/finmarks';
// One entity, fully typed
const hdfc = getEntity('hdfc-bank');
hdfc?.brand_color; // '#004C8F'
hdfc?.ifsc_prefix; // 'HDFC'
hdfc?.upi_handles; // ['@hdfcbank']
// A logo URL
getLogoUrl('hdfc-bank', 'icon');
// 'https://cdn.jsdelivr.net/gh/Finmarks/Finmarks@main/entities/hdfc-bank/icon.svg'
// Everything in a category
getByCategory('upi-psp'); // 26 entities
getByCategory(['upi-psp', 'payment-gateway']); // union, deduped
// Search across name, id, tags, UPI handles and IFSC prefixes
search('paytm');
search('bank', { categories: 'neobank', limit: 5 });The metadata is the point. These resolve the identifiers you actually have at runtime:
import { getByIfscPrefix, getByUpiHandle } from '@finmarks/finmarks';
// You have an IFSC code from a bank account
getByIfscPrefix('HDFC0000123'.slice(0, 4)); // → HDFC Bank
// You have a VPA from a UPI transaction
getByUpiHandle('someone@ybl'); // → PhonePeimport { getByIfscPrefix, getLogoUrlWithFallback } from '@finmarks/finmarks';
function AccountRow({ ifsc }: { ifsc: string }) {
const bank = getByIfscPrefix(ifsc.slice(0, 4));
if (!bank) return null;
return (
<div style={{ borderLeft: `3px solid ${bank.brand_color}` }}>
<img
src={getLogoUrlWithFallback(bank.id, ['square', 'icon', 'full'])}
alt={bank.name}
width={32}
height={32}
/>
<span>{bank.short_name}</span>
</div>
);
}Every asset is served free by jsDelivr straight from this repository — no account, no API key, no rate limit:
<img src="https://cdn.jsdelivr.net/gh/Finmarks/Finmarks@main/entities/hdfc-bank/icon.svg" width="32" />
<img src="https://cdn.jsdelivr.net/gh/Finmarks/Finmarks@main/entities/phonepe/full.svg" alt="PhonePe" width="120" />The index is fetchable too:
BASE=https://cdn.jsdelivr.net/gh/Finmarks/Finmarks@main
curl $BASE/dist/index.json # full dataset
curl $BASE/dist/index-lite.json # id, name, categories, colour
curl $BASE/dist/categories.json # taxonomy with counts| Category | Label | Regulator | Entities |
|---|---|---|---|
public-sector-bank |
Public sector banks | RBI | 12 |
private-bank |
Private banks | RBI | 15 |
small-finance-bank |
Small finance banks | RBI | 10 |
payments-bank |
Payments banks | RBI | 6 |
upi-psp |
UPI / PSP apps | NPCI | 26 |
wallet |
Prepaid wallets | RBI | 7 |
payment-gateway |
Payment gateways | RBI | 13 |
neobank |
Neobanks | RBI | 9 |
bnpl |
Buy Now Pay Later | RBI | 9 |
lending-platform |
Digital lending | RBI | 20 |
wealthtech |
Investing platforms | SEBI | 13 |
insurtech |
Insurance platforms | IRDAI | 7 |
infra-api |
Infra / API platforms | Varies | 10 |
account-aggregator |
Account Aggregators | RBI | 6 |
credit-bureau |
Credit bureaus | RBI | 4 |
nbfc |
NBFCs | RBI | 7 |
Categories are tags, not folders — an entity can hold several. Paytm is upi-psp, wallet, bnpl, payments-bank, wealthtech and payment-gateway at once.
Four more categories are defined and awaiting entities: international-bank, crypto-exchange, pos-terminal, regulator.
Logo assets are being sourced. All 115 entities carry complete, validated metadata today. SVG artwork is landing entity by entity — run
pnpm check-logosfor live coverage, and see CONTRIBUTING.md if you want to help.
| Function | Returns |
|---|---|
getEntity(id) |
Entity | undefined |
mustGetEntity(id) |
Entity — throws on unknown id |
hasEntity(id) |
boolean |
getLogoUrl(id, variant?) |
string | undefined |
getLogoUrlWithFallback(id, variants?) |
first variant that exists |
getLogos(id) |
every available URL, keyed by variant |
getByCategory(cat | cats, opts?) |
union of categories |
getByAllCategories(cats, opts?) |
intersection of categories |
getByIfscPrefix(prefix) |
Entity | undefined |
getByUpiHandle(vpaOrHandle) |
Entity | undefined |
search(query, opts?) |
ranked Entity[] |
listCategories() |
CategoryInfo[] with counts |
getCategory(id) |
one CategoryInfo |
getAllEntities(opts?) |
every entity |
getAllEntityIds() |
every id |
buildLogoUrl(id, filename) |
a CDN URL, no lookup |
Full reference in docs/api.md.
| Variant | What it is |
|---|---|
full |
Symbol + wordmark. The primary logo. |
icon |
Symbol only, no text. Square-ish. |
entities/{id}/entity.json source of truth — one folder per brand
entities/{id}/*.svg logo variants
schemas/ JSON Schema + category taxonomy
scripts/ validate, generate, check-logos, convert-png
packages/Finmarks/ the npm package
dist/ generated index — never edited by hand
pnpm install
pnpm validate # schema + cross-file checks (the CI gate)
pnpm check-logos # coverage report, never fails
pnpm generate # rebuild dist/
pnpm build # validate + generate + build the package
pnpm test # validate + package testsMissing brands and missing logo variants are the two things this project needs most. CONTRIBUTING.md covers the schema, logo quality standards, and how to open a PR.
The MIT licence covers the code and metadata in this repository. It does not grant rights to the trademarks themselves — every logo remains the property of its owner, and your use of a mark is governed by that brand's own trademark policy. See docs/trademarks.md.