← Blog

Introducing BrandIcons: a simple, public-key API for serving brand icons

· BrandIcons Team · launch, announcement

What we shipped

BrandIcons is a logo and icon API for any domain. You make a request with a domain, you get the icon back. That’s the whole product. No SDK to install, no backend proxy to set up, no favicon scraping on your own servers — just an image URL you put in an <img> tag.

Why we built it

We were building an email service and needed to show sender logos. SaaS senders were easy — anything works. But plenty of senders don’t have a real website at all: some only send mail, some sit on parked domains. We kept hitting empty placeholders, and nothing we tried filled them.

We looked at what already existed:

  • Unofficial free services like Google S2 (google.com/s2/favicons) and DuckDuckGo (icons.duckduckgo.com/ip3). Great when they work, but they’re not real products. No support, no SLA, they can change or disappear at any time, and coverage gets thin on less common domains.
  • Paid servicesClearbit ran the most popular one for years and recently shut it down. Logo.dev and Brandfetch are the current paid options. They work, but free quotas are small, and their coverage on rare domains is about the same as the free services because they crawl the same sources.

So we wrote a worker that uses AI to find icons for domains where there’s no website to crawl, and paired it with a generous free tier, a cheap upgrade to remove attribution, and domain-locked public keys.

If your current provider works for you, you’re not the audience. If you’ve ever written your own favicon scraper because coverage missed half your customer list, you might be.

How it works

The URL format is simple:

https://cdn.brandicons.dev/icons/{domain}/{size}?key={YOUR_API_KEY}

Sizes are ico, small (32×32), medium (64×64, default), large (128×128), and vector (SVG when available). Optional ?p= sets a not-found placeholder, ?pl= sets a loading placeholder — both accept built-ins like @image-off and @loader-spin, or the names of icons you’ve uploaded.

What happens behind the scenes: requests hit a CloudFront Function at the edge that checks the API key and rewrites the URL. There are three paths:

  • Cache hit: ~20ms in the browser (16ms on ethernet, ~26ms on wi-fi). Icon ships from the edge cache — CloudFront Function + S3.
  • Cache miss: the first time anyone in the world asks for a new domain, we go find the icon. Your loading placeholder shows while we search. The result is cached globally — every later request anywhere is back to the fast path.
  • Invalid key: rejected at the edge, never reaches our backend.

The cache-miss path is where the work happens. We try DuckDuckGo first, and for domains without a live website we use our AI worker to research the brand and find an icon. You don’t have to wait for it actively — the loading placeholder is shown, and react-brandicons swaps in the real icon when it’s ready.

Public-key by design — with domain-locking

API keys are public. They’re meant to go in URLs your browser fetches — drop one in client-side React, an <img> tag in plain HTML, a Notion embed, anywhere. (Logo.dev and Brandfetch’s public logo APIs work the same way. This is normal for a logo CDN.)

What keeps your key safe is per-key domain-locking. Each key is tied to the domains you register it for. If someone copies your key from your frontend and uses it on their own site, the edge checks the Referer header and rejects the request before it reaches the backend. Your quota stays yours.

Pricing in 30 seconds

PlanPriceRequests/mo
CommunityFree500,000 (attribution required)
Hobby$9/mo100,000
Starter$19/mo500,000
Pro$49/mo3,000,000
Ultimate$149/mo10,000,000

Annual billing saves 17%. All plans share the same global CDN, all sizes, and the twelve built-in placeholders.

The Community plan and attribution

The free tier exists because a lot of side projects don’t need a paid plan, and we don’t want them to. In exchange, the Community plan asks for a visible link to us on your production site:

<a href="https://brandicons.dev">Icons by BrandIcons</a>

A few rules so the link does its job:

  • Do-follow. No rel="nofollow" and no rel="noreferrer" — the link needs to pass referrer data.
  • Visible. Next to your logo grid, in the footer with other credits, or on an About/Credits page. Not hidden behind display: none.
  • On production. A real, publicly accessible URL — not staging, not localhost.

Any paid plan removes the requirement.

Try it

Sign up at app.brandicons.dev/signup, grab a key, drop it in an <img> tag, and you’re done. The Community plan covers most side projects from day one. You can upgrade later if you need more.

If you want to see the plans first, pricing is here.

We built this for ourselves, and we’re glad to finally share it. Let us know what you use it for.