# Website Brand & Favicon Extractor (`technicaldost/website-brand-favicon-extractor`) Actor

Pull the brand assets a website declares about itself: favicons and apple-touch icons at every size, logo, Open Graph and Twitter card images, theme colour, site name and description. Every asset URL is verified to exist before it is returned. No API key.

- **URL**: https://apify.com/technicaldost/website-brand-favicon-extractor.md
- **Developed by:** [Technical Dost Solutions](https://apify.com/technicaldost) (community)
- **Categories:** Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$2.00 / 1,000 site extracteds

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Website Brand & Favicon Extractor

**Get the icon, logo, colours and name a website declares about itself — for thousands of domains, with every asset URL verified to exist.**

The usual failure in this category is returning `/favicon.ico` for sites that do not have one. This Actor sends a HEAD request for every asset and drops the dead ones, so what you get back actually renders.

### What you get

```json
{
  "domain": "stripe.com",
  "siteName": "Stripe",
  "description": "Stripe powers online payment processing...",
  "bestIconUrl": "https://images.stripeassets.com/.../favicon.png",
  "bestIconSizePx": 180,
  "logo": "https://images.stripeassets.com/.../stripe-logo.png",
  "ogImage": "https://images.stripeassets.com/.../og.png",
  "themeColor": "#635bff",
  "language": "en",
  "iconCount": 4,
  "icons": [
    { "url": "...", "kind": "apple-touch-icon", "sizePx": 180, "exists": true, "bytes": 4821 }
  ]
}
```

### Main use cases

- **CRM and directory enrichment.** Turn a list of company domains into logos and brand colours for your UI.
- **Link previews and cards** — pair with Open Graph metadata.
- **Competitive and portfolio monitoring** — track when a brand refreshes its identity.
- **Design research.** Collect theme colours across an industry.
- **Investor and marketplace listings** that need a logo per company.

### Where the assets come from

| Field | Source |
|---|---|
| `icons` | `<link rel="icon">`, `apple-touch-icon`, `mask-icon`, plus an implicit `/favicon.ico` probe |
| `logo` | JSON-LD `Organization.logo` — the most reliable declared logo |
| `ogImage` / `twitterImage` | Open Graph and Twitter card tags |
| `siteName` | `og:site_name`, then JSON-LD name, then `<title>` |
| `themeColor` | `<meta name="theme-color">` |

`bestIconUrl` is the largest verified icon, which is the one worth displaying.

### Pricing

| Event | Price | When |
|---|---|---|
| **Site extracted** | **$0.002** | One website's brand assets successfully extracted |

Sites that could not be reached are **not** charged.

**1,000 websites = $2.00.**

### Input

| Field | Type | Default | Notes |
|---|---|---|---|
| `websites` | array | **required** | Bare domains work. Up to 5,000. |
| `verifyAssets` | boolean | `true` | HEAD every asset and drop dead URLs. Off is faster but returns icons that 404. |
| `concurrency` | integer | `8` | Parallel sites. |

### Limitations

- **No JavaScript rendering**, so assets injected client-side are missed. The overwhelming majority of sites declare icons and Open Graph tags in the initial HTML.
- **No image analysis.** `themeColor` is the value the site declares, not a colour sampled from the logo. No dominant-colour extraction.
- **`logo` is only returned when the site publishes JSON-LD** with an Organization logo. Many sites do not; `bestIconUrl` is the dependable fallback.
- Assets are linked, not downloaded or rehosted — you get URLs.

### Related Actors

- **[Link Preview API](https://apify.com/technicaldost/link-preview-api)** — full OpenGraph unfurling for individual URLs.
- **[Bulk Email Deliverability Auditor](https://apify.com/technicaldost/bulk-email-deliverability-auditor)** — enrich the same domain list with mail configuration.

### Reliability

- Retries on 429 and 5xx with exponential backoff; permanent 4xx errors are not retried.
- Bad input is reported and skipped, never charged.
- One failing target never aborts the rest of the run.
- Concurrency is bounded and configurable — this work is network-bound, so parallel requests, not memory, are what control speed.

### Data source and responsible use

Reads only publicly available data. No authentication bypass, no CAPTCHA circumvention, no browser automation.

Not affiliated with any of the services checked.

# Actor input Schema

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

Website URLs. A bare domain works - stripe.com becomes https://stripe.com.

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

How many to process at once. This work is network-bound, so concurrency - not memory - is what controls speed.

## `verifyAssets` (type: `boolean`):

Sends a HEAD request per asset and drops dead URLs. Turning this off is faster but will return icons that 404.

## Actor input object example

```json
{
  "websites": [
    "https://stripe.com",
    "https://github.com"
  ],
  "concurrency": 8,
  "verifyAssets": true
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `csv` (type: `string`):

No description

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

No description

# 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": [
        "https://stripe.com",
        "https://github.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("technicaldost/website-brand-favicon-extractor").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": [
        "https://stripe.com",
        "https://github.com",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("technicaldost/website-brand-favicon-extractor").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": [
    "https://stripe.com",
    "https://github.com"
  ]
}' |
apify call technicaldost/website-brand-favicon-extractor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,technicaldost/website-brand-favicon-extractor"
        }
    }
}

```

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/icbq2VyffJcATlwvA/builds/EyhWaCM5c9fnqL4sZ/openapi.json
