# Company Logo & Favicon Finder (`metallic_pastry/company-logo-finder`) Actor

- **URL**: https://apify.com/metallic_pastry/company-logo-finder.md
- **Developed by:** [Simon Liarsgård](https://apify.com/metallic_pastry) (community)
- **Categories:** Developer tools, Lead generation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 company with logo founds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Company Logo & Favicon Finder

Get a company's logo, app icon, favicon, brand name and brand colours from its domain, any URL on its website, or a work email address. It's a drop-in replacement for the retired Clearbit Logo API, and every file is checked as a real image before you pay for it.

Paste `stripe.com`, `https://www.ikea.com/se/sv/` or `jane@shopify.com` and get one row per company. The row has the best logo (SVG when the site has one), a square app icon, a small favicon, width, height, format and SHA-256 for each file, the brand name and up to eight brand colours. You can also store the files in the run so you never hotlink the company's servers, and track logo changes on a schedule to catch rebrands.

### What you can use it for

- **CRM and lead enrichment.** Add logos to accounts in HubSpot, Salesforce or Pipedrive from the company domain or a contact's work email.
- **Directories, marketplaces and comparison sites.** Fill vendor, partner or customer lists with a consistent logo and icon per company.
- **Sales tools and dashboards.** Show a recognisable icon next to every account, deal or integration.
- **Agencies and designers.** Pull a client's logo files and brand colours in one go before a pitch.
- **Rebrand monitoring.** Run it weekly with change tracking on and get `logoChanged: true` when a company ships a new logo.

### Input

| Field | Default | What it does |
|---|---|---|
| `websites` | required | One per line: a domain, a URL on the site, or a work email. Free email providers (gmail.com, outlook.com and others) are rejected without charge. Duplicates of the same domain are removed. |
| `downloadLogos` | `false` | Store the chosen logo, icon and favicon in the run's key-value store and return a `storedUrl` for each. Identical files are stored once. |
| `includeAllCandidates` | `false` | Add a `candidates` list with every logo and icon the page offers, including the `og:image` and `twitter:image` social cards, and the reason any file was rejected. |
| `trackChanges` | `false` | Remember each company's files (by SHA-256) and report what changed since the previous run. |
| `stateKey` | `default` | Keeps separate change histories for different lists or schedules. |
| `concurrency` | `10` | Websites checked in parallel (1-50). |

Example:

```json
{
    "websites": ["stripe.com", "ikea.com", "https://www.bbc.co.uk", "jane@shopify.com"],
    "downloadLogos": true
}
```

### Output

One row per input. A shortened example:

```json
{
    "input": "ikea.com",
    "domain": "ikea.com",
    "websiteUrl": "https://www.ikea.com/",
    "status": "found",
    "brandName": "IKEA",
    "brandNameSource": "og_site_name",
    "logoUrl": "https://www.ikea.com/global/assets/logos/brand/ikea.svg",
    "logoSource": "json_ld",
    "logoType": "logo",
    "iconUrl": "https://www.ikea.com/global/en/images/favicon.ico",
    "faviconUrl": "https://www.ikea.com/global/en/images/favicon.ico",
    "logo": {
        "url": "https://www.ikea.com/global/assets/logos/brand/ikea.svg",
        "storedUrl": "https://api.apify.com/v2/key-value-stores/.../records/ikea.com-logo.svg?signature=...",
        "dataUri": null,
        "source": "json_ld",
        "format": "svg",
        "width": 98,
        "height": 40,
        "bytes": 1521,
        "sha256": "..."
    },
    "icon": { "format": "ico", "width": 48, "height": 48, "...": "..." },
    "favicon": { "...": "..." },
    "themeColor": null,
    "brandColors": [
        { "hex": "#0058a3", "source": "logo_svg" },
        { "hex": "#ffdb00", "source": "logo_svg" }
    ],
    "changes": null,
    "homepageStatus": 200,
    "robotsTxt": "allowed",
    "errorCode": null,
    "errorMessage": null,
    "checkedAt": "2026-10-30T09:52:28.468Z"
}
```

- `logoUrl`, `iconUrl` and `faviconUrl` are always usable as an image `src`. They point to the original file, or to the stored copy or a `data:` URI when the logo is an inline SVG in the page's HTML.
- `logo` is the best brand mark the site publishes, chosen in this order:
  1. a logo in the site header (inline SVG or image), the Organization `logo` in JSON-LD, or a logo image or SVG elsewhere on the homepage;
  2. an `og:image` or `twitter:image` that is named and shaped like a logo (hero photos and share cards are never used);
  3. the largest web app manifest icon, then the largest apple-touch-icon (at least 120 px).
- `logoType` says which step the logo came from: `logo`, `social_logo` or `icon_fallback`. Filter on `logoType = "logo"` if you only want real logos. `logoSource` repeats `logo.source` at the top level.
- `icon` is the largest square icon (apple-touch-icon, web app manifest, `link rel=icon`, up to 512 px). `favicon` is the icon closest to 32 px.
- `source` tells you where each file came from: `header_logo_svg`, `header_logo_img`, `json_ld`, `logo_img`, `logo_svg`, `apple_touch_icon`, `manifest_icon`, `icon_link`, `mask_icon`, `ms_tile`, `favicon_ico`, `og_image` or `twitter_image`.
- `brandName` is taken from, in order of trust: `og:site_name`, the Organization name in JSON-LD, the WebSite name in JSON-LD, the manifest `short_name` and `name`, `application-name`, then the part of the `<title>` that matches the domain. A name that matches the domain wins over a higher-ranked one that looks like a tagline, taglines after separators are cut ("Amazon.com. Spend less." becomes "Amazon"), and titles of error or bot-check pages are never used. `brandNameSource` tells you which one was used: `og_site_name`, `json_ld_organization`, `json_ld_website`, `manifest_short_name`, `manifest_name`, `application_name` or `title`.
- `width` and `height` come from the file itself, not from HTML attributes. For SVG they come from the viewBox.
- `brandColors` lists theme-color, manifest, Windows tile and Safari mask-icon colours, followed by the fill colours in an SVG logo, most used first.
- `changes` (with `trackChanges`) has `firstRun`, `logoChanged`, `iconChanged`, `faviconChanged`, `previousLogoUrl`, `previousIconUrl` and `previousCheckedAt`. A new CDN URL for the same file isn't a change. Changes are only reported when both runs found that file.

#### Status values

| Status | Meaning | Charged |
|---|---|---|
| `found` | A logo was found (`logoType` is `logo` or `social_logo`), plus icon and favicon where available. | yes |
| `icon_only` | No dedicated logo, but a verified app icon or favicon. When the icon is at least 120 px it is also returned as `logoUrl` with `logoType: "icon_fallback"`. Common for sites that draw their header with JavaScript, and for bot-walled sites that still serve `/favicon.ico`. | yes |
| `not_found` | The page loaded, but no usable image was found. | no |
| `blocked` | The homepage refused automated access (403, 429 or a challenge page), and no favicon was available. | no |
| `unreachable` | DNS, TLS or connection error, or an HTTP error on the homepage. | no |
| `blocked_by_robots` | robots.txt disallows the homepage, or robots.txt returned a server error (RFC 9309). | no |
| `invalid_input` | Not a domain, URL or email, or a free email provider. | no |

The dataset has four views: **Logos** (with image previews), **Files**, **Changes** and **Not found / errors**. The `RUN_SUMMARY` record in the key-value store has counts per status, files stored, logo changes and charged events.

### Pricing

Pay per event, plus a tiny start fee:

| Event | Price | When |
|---|---|---|
| Company with logo found | $0.002 ($2 per 1,000) | each company with status `found` or `icon_only` |
| Logo file stored | $0.0005 | add-on, each file saved with `downloadLogos` |

You don't pay for companies where nothing usable was found, blocked or unreachable websites, robots.txt opt-outs, invalid input, webmail domains or the candidates list. 1,000 companies with stored logo, icon and favicon cost at most $3.50. Set a maximum charge on the run if you want a hard ceiling. The Actor then stops cleanly and lists the companies it didn't check in the run summary.

### How it works and what it respects

The Actor loads the homepage once and reads the logos, icons and metadata the site publishes in its HTML, JSON-LD and web app manifest. It then downloads at most 14 candidate files per company and checks each one's real format and size. HTML error pages served as images, tracking pixels, customer and partner logo walls, award badges and app-store buttons are skipped.

robots.txt is honoured for every request, including logo files on a CDN. The Actor identifies itself as `CompanyLogoFinder` in the user agent and paces requests to each host (one every 200 ms). It doesn't use proxies, run a browser or solve bot challenges.

### Limits

- Sites that render their header entirely with JavaScript, like some single-page apps, may only return `icon_only`. You still get their largest manifest or apple-touch icon as `logoUrl` (`logoType: "icon_fallback"`), but not the wide wordmark.
- Logos drawn with CSS background images aren't detected.
- Some large retailers and banks block requests from cloud servers. They come back as `blocked` at no charge, or `icon_only` when `/favicon.ico` is still served.
- Stored files live in the run's default key-value store and follow your account's data retention. Copy them somewhere permanent if you need them for longer.
- Inline SVG logos have no URL of their own. Under 30 KB they come back as a `data:` URI. Larger ones need `downloadLogos` to get a URL.
- The logo is read from the homepage of the domain. Sub-brands that only appear on deeper pages aren't found.

### Support

Got a wrong or missing logo for a company? Open an issue on the Actor page with the domain, and it will usually be fixed in the next version.

# Changelog

This Actor's version history is a separate document: https://apify.com/metallic_pastry/company-logo-finder/changelog.md

# Actor input Schema

## `websites` (type: `array`):

One per line: a domain ("stripe.com"), any URL on the site ("https://www.ikea.com/se/sv/"), or a work email ("jane@acme.com"). The logo is always read from the site's homepage. Free email providers such as gmail.com are rejected without charge. Duplicates of the same domain are removed.

## `downloadLogos` (type: `boolean`):

Save the chosen logo, app icon and favicon in this run's key-value store and return a stable file URL for each (storedUrl), so you never hotlink the company's own servers. Charged per stored file; identical files are stored once.

## `includeAllCandidates` (type: `boolean`):

Add a candidates list with every logo and icon the page offers (and the og:image social card), with format, size and why a file was rejected. Useful to choose a different variant yourself. Not charged extra.

## `trackChanges` (type: `boolean`):

Remember each company's logo, icon and favicon (by file hash) in a named key-value store and report logoChanged / iconChanged on later runs. Use it on a schedule to catch rebrands. A new CDN URL for the same file is not reported as a change.

## `stateKey` (type: `string`):

Separate histories for different lists or schedules. Letters, digits, - and \_ only.

## `concurrency` (type: `integer`):

How many companies are checked at the same time. Each site still gets at most one request per 200 ms.

## Actor input object example

```json
{
  "websites": [
    "stripe.com",
    "ikea.com",
    "https://www.bbc.co.uk",
    "jane@shopify.com"
  ],
  "downloadLogos": false,
  "includeAllCandidates": false,
  "trackChanges": false,
  "stateKey": "default",
  "concurrency": 10
}
```

# Actor output Schema

## `logos` (type: `string`):

Default dataset, Logos view.

## `files` (type: `string`):

Default dataset, Files view with original and stored URLs.

## `changes` (type: `string`):

Default dataset, Changes view.

## `runSummary` (type: `string`):

RUN_SUMMARY record: counts per status, files stored, logo changes and charged events.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "websites": [
        "stripe.com",
        "ikea.com",
        "https://www.bbc.co.uk",
        "jane@shopify.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("metallic_pastry/company-logo-finder").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "websites": [
        "stripe.com",
        "ikea.com",
        "https://www.bbc.co.uk",
        "jane@shopify.com",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("metallic_pastry/company-logo-finder").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "websites": [
    "stripe.com",
    "ikea.com",
    "https://www.bbc.co.uk",
    "jane@shopify.com"
  ]
}' |
apify call metallic_pastry/company-logo-finder --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,metallic_pastry/company-logo-finder"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/PIAvg5l3ryHdH7lff/builds/mKTUyBeFfuBxesdnR/openapi.json
