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.svgEverything 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
| kind | formats | canvas | bleed | use it for |
|---|---|---|---|---|
logo | svg, png | 2000×1080 | 100 px | the full logo in brand colour |
mark | svg, png | 1080×1080 | 200 px | the square symbol, avatars, tables |
logo-rev | svg, png | 2000×1080 | 100 px | white logo for dark or coloured backgrounds |
mark-rev | svg, png | 1080×1080 | 200 px | white 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.jsonOne 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.