Using the logos

Every logo is a static file at a predictable URL. There's no key and no SDK: build the URL from a ticker and put it in an <img>, a slide or a spreadsheet.

The URL pattern

https://pub-9707c1f6c2184df3994177f1b6de6bf9.r2.dev/logos/v1/{kind}/{ticker}.{ext}

For example, Apple's mark as SVG:

https://pub-9707c1f6c2184df3994177f1b6de6bf9.r2.dev/logos/v1/mark/AAPL.svg

Everything lives under /v1/. A breaking change would go to /v2/, so a v1 URL that works today keeps working. Files are never removed from v1 except at a brand owner's request.

Kinds and sizes

kindformatscanvasbleeduse it for
logosvg, png2000×1080100 pxthe full logo in brand colour
marksvg, png1080×1080200 pxthe square symbol, avatars, tables
logo-revsvg, png2000×1080100 pxwhite logo for dark or coloured backgrounds
mark-revsvg, png1080×1080200 pxwhite mark for dark or coloured backgrounds

The bleed is the empty margin inside the canvas. Because every file has the same canvas and the same margin, logos line up when you place them at the same size, with no per-company nudging.

Small PNGs for email are also published at email/mark-64, email/mark-128 (both square) and email/logo-400 (400×216), rendered at 2× for display at half size.

Tickers

File names use the listing ticker with a dot for share classes: BRK.B. Most data feeds write BRK-B instead, and some symbols don't follow a rule at all (GOOGL, 7974.T). Rather than converting them yourself, look them up in the manifest's yahoo map, which takes the Yahoo Finance spelling and returns the file name.

The manifest

https://pub-9707c1f6c2184df3994177f1b6de6bf9.r2.dev/logos/v1/manifest.json

One JSON file listing every company. Fetch it once, cache it, and build URLs from it.

{
  "version": "v1",
  "base_url": "https://pub-9707c1f6c2184df3994177f1b6de6bf9.r2.dev",
  "paths":   { "logo": "logos/v1/logo/{ticker}.{ext}", ... },
  "yahoo":   { "BRK-B": "BRK.B", "GOOGL": "GOOG-L", ... },
  "tickers": { "BRK.B": { "yahoo": "BRK-B", "mark_method": "fallback", ... } }
}

A URL is base_url + / + paths[kind] with the ticker and extension filled in.

const m = await (await fetch("https://pub-9707c1f6c2184df3994177f1b6de6bf9.r2.dev/logos/v1/manifest.json")).json();
const ticker = m.yahoo["BRK-B"] ?? "BRK-B";
const src = m.base_url + "/" + m.paths.mark
  .replace("{ticker}", ticker).replace("{ext}", "svg");

When to use the logo instead of the mark

Some companies don't have a separate symbol. For those (628 of 2488), the mark is the whole logo fitted into the square, which is hard to read below about 64 px. The manifest flags them with "mark_method": "fallback". Check it, and use the logo at small sizes when it's set.

Fetching from a server

Browsers and email clients load the images without any setup. Code that fetches files directly should send a normal User-Agent header, since requests from some default HTTP-library agents are refused.

Caching

Images are cached for a day and the manifest for five minutes. When a company updates its logo, the file is replaced at the same URL, so a new version can take up to a day to reach everyone.

Using logos responsibly

Use a logo to identify or refer to its company, and don't alter it or suggest the company endorses you. The brand policy has the details, and there's more in the terms.