Logo Lava

A fallback for company logos

When the real logo is missing or the image fails to load, show a generated one instead of a broken picture.

Free. No sign-up. PNG and SVG.

What this is, and what it is not

Logo Lava does not look up real company logos. It cannot tell you what Fennmoor Dental's real logo looks like, and it does not try to. What it does is draw a clean, consistent logo from a company name, so that a list of companies has an image beside every row even when the real one is missing. The six above are made up.

That makes it a fallback and not a replacement. Keep using whatever source you have for the real logos, and ask Logo Lava only when that source has nothing or fails to load.

Why a fallback is needed now

A number of products used the free Logo API at logo.clearbit.com to show a company's logo from its domain name. Clearbit's changelog entry for November 24, 2025 says the free Logo API would be shut down on December 8, 2025, and HubSpot published a notice about the sunset as well. When we checked on October 25, 2026, a request to the old address did not connect. If your product still points at it, those images fail without a message, and users see a gap or a broken-image icon.

Whatever you use for real logos instead, the same lesson applies: no source has every company, and any source can go away. A fallback means a missing image shows a tidy placeholder and not a hole.

One tag: the onerror fallback

The smallest version needs no script file. Point the image at your usual source, and give it an onerror handler that swaps in the Logo Lava URL if the first image fails. The this.onerror=null part stops a loop if the fallback itself were to fail.

<img src="https://logos.example.com/acme.com.png"
     onerror="this.onerror=null;this.src='https://api.logolava.com/v2/logo.png?text=Acme+Corp&seed=1042&layout=icon&w=128&h=128'"
     width="64" height="64" alt="Acme Corp logo">

Replace logos.example.com with your own source. The seed should be a number that stays the same for that company, such as its row id, so its placeholder never changes.

A small JavaScript version

If you build the page with JavaScript, a function keeps the rule in one place. It takes the image, the company name and an id, and fixes the image if it fails to load.

function logoFallback(img, name, id) {
  img.addEventListener('error', function () {
    var q = new URLSearchParams({ text: name, seed: String(id), layout: 'icon', w: 128, h: 128 });
    img.src = 'https://api.logolava.com/v2/logo.png?' + q;
  }, { once: true });
}

Call it before you set src, or on images that are already in the page. The once: true option removes the handler after it has run, so a failing fallback cannot loop. URLSearchParams encodes the ampersand and spaces in names such as Juniper & Vale for you.

A server-side version

Doing it on the server is the better choice for a product with many users, for two reasons. The fallback can be saved with the company so it is fetched once, and any API key stays private. This Node example tries your real source first, and falls back to Logo Lava if it gets no image back.

async function companyLogo(name, id, realUrl) {
  if (realUrl) {
    const r = await fetch(realUrl);
    if (r.ok && r.headers.get('content-type')?.startsWith('image/')) return Buffer.from(await r.arrayBuffer());
  }
  const q = new URLSearchParams({ text: name, seed: String(id), layout: 'icon', w: 256, h: 256 });
  const r = await fetch('https://api.logolava.com/v2/logo.png?' + q);
  return Buffer.from(await r.arrayBuffer());
}

Store the result against the company and serve it from your own storage. A key, passed as api_key, raises the limits from 60 a minute and 1,500 a day to 300 a minute and 50,000 a day, and should only ever be used from a server. Without a key, a modest list of companies is well inside the limit, and each one is fetched once.

Details worth getting right

Use the company's database id as the seed and not a hash of its name, so a rename does not change the placeholder. Ask for the size you will show, with w and h, and add scale=2 if you display it on high-density screens. Keep alt text meaningful, such as the company name, since the generated image is a placeholder and screen readers should still say whose it is.

The same technique works for workspaces and accounts in your own product, which is covered on the placeholder logos page. For a logo made from a domain name instead of a company name, see the domain logo generator. Limits and status codes are in the docs.

For developers

The fallback URL

https://api.logolava.com/v2/logo.png?text=Fennmoor+Dental&seed=7&layout=icon&w=128&h=128

Use the company name as text and any stable number for it as seed. The same pair always returns the same image.

Try a company name