# Website Brand Kit Extractor – Logo, Favicon, Colors & Fonts (`gazidev/website-brand-extractor`) Actor

Extract any website's brand kit: logo (incl. inline SVG), favicon, primary/secondary/accent colour palette, button and text colours, CSS colour tokens, heading and body fonts (Google, self-hosted, Adobe), social profiles. Reads HTML + CSS, no browser.

- **URL**: https://apify.com/gazidev/website-brand-extractor.md
- **Developed by:** [Cemal Atakli](https://apify.com/gazidev) (community)
- **Categories:** Developer tools, Lead generation
- **Stats:** 4 total users, 3 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 brand kit 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?

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

## Website Brand Kit Extractor – Logo, Colors, Fonts

Get any company's **brand kit from its website** in one call: logo (including inline SVG), favicon and app icons, **primary / secondary / accent colours**, button, background and text colours, **CSS colour tokens**, **heading and body fonts** (Google Fonts, self-hosted or Adobe), social profiles and the web-app manifest.

It reads the page HTML **and its stylesheets**, so colours and fonts come from what the site actually uses — not from a screenshot guess. No browser, so it is fast and cheap: **$1.50 per 1,000 websites**.

### What you can use it for

- **Personalised outreach and mockups**: put a prospect's logo and colours into a proposal, landing page or demo.
- **Onboarding / white-label apps**: pre-fill a customer's brand theme from their domain.
- **Design systems and Tailwind themes**: pull CSS colour tokens (`--brand-primary`, `--color-accent`…) ranked by usage.
- **Competitor and market research**: compare palettes and typography across hundreds of sites.
- **CRM and lead enrichment**: add logo, brand colour and social links to company records.
- **AI agents**: give an LLM a structured brand profile instead of raw HTML.

### Output (one row per website)

| Field | Example |
|---|---|
| `brandName` | `Shopify` |
| `logo` | best logo URL (JSON-LD, header `<img>`, manifest icon, apple-touch-icon, favicon — in that order) |
| `logoSvg` | inline `<svg>` markup when the header logo is drawn in SVG |
| `logoCandidates` | all candidates with source, format and pixel size |
| `primaryColor`, `secondaryColor`, `accentColor` | `#11352d`, `#244749`, … |
| `buttonColor`, `backgroundColor`, `textColor` | most used call-to-action, page background and text colours |
| `brandColors` | ranked palette: hex, rgb, hsl, share of use, roles (background, text, border, button, token), number of shades merged |
| `neutralColors` | whites, greys and blacks used by the site |
| `declaredColors` | colours the owner declared: `theme-color`, manifest `theme_color`, `msapplication-TileColor`, Safari mask-icon |
| `colorTokens` | CSS custom properties holding colours, with usage counts |
| `headingFont`, `bodyFont` | `GT-Walsheim-Regular`, `Inter` |
| `headingFontSource`, `bodyFontSource` | `google-fonts`, `self-hosted`, `system`, … |
| `googleFonts`, `customFonts`, `fontFaces` | families, weights and font file URLs |
| `socialProfiles` | LinkedIn, X, Instagram, Facebook, YouTube, GitHub… |
| `manifest` | name, short name, theme/background colour, icons |
| `favicon`, `appleTouchIcon`, `ogImage` | icon and social-share image URLs |

Dataset views: **Brand kit**, **Colour palette**, **Typography**, **Logos, icons & social**.

#### Example (shortened)

```json
{
  "url": "https://apify.com",
  "brandName": "Apify",
  "logo": "https://apify.com/img/apify-logo/apify-symbol-200x200.svg",
  "primaryColor": "#246dff",
  "headingFont": "GT-Walsheim-Regular",
  "bodyFont": "Inter",
  "headingFontSource": "self-hosted",
  "brandColors": [{"hex": "#246dff", "rgb": [36, 109, 255], "hsl": [220, 100, 57], "share": 0.05, "roles": ["token", "background"], "shades": 3}],
  "colorTokens": [{"name": "--color-primary-action", "value": "#246dff", "uses": 41}]
}
```

### How colours are ranked

1. Every colour in inline `<style>`, `style=""` attributes and up to 8 linked stylesheets (plus `@import`) is counted by where it is used. Button / call-to-action rules weigh 3×, headings 1.5×, plain text colour 0.6×.
2. Colours behind CSS variables are weighted by how often `var(--token)` is used.
3. Code samples (`<pre>`, `<code>`, syntax-highlighting themes) are ignored, so a dark code block does not become "the brand colour".
4. Near-identical shades are merged; whites, greys and blacks go to `neutralColors`.
5. Colours the site declares (`theme-color`, manifest) are ranked first when they are colourful.

### Input

- **Websites** – list of URLs or bare domains. Home pages give the best results.
- **Check logo files** (default on) – verifies each logo/icon and reports format and size.
- **Include inline SVG logo**, **Include CSS colour tokens** – on by default.
- **Max brand colours** (8), **Max stylesheets per site** (8).
- Advanced: concurrency, per-site politeness, timeouts, retries, robots.txt, User-Agent, proxy.

Empty input runs a small demo on apify.com and shopify.com.

### Pricing

Pay per event: **$0.0015 per website** with `ok: true` ($1.50 / 1,000). Failed URLs (network errors, 4xx/5xx, robots.txt, bot challenges) are written to the dataset but **not charged**. The run respects your *Maximum cost per run* and stops cleanly when it is reached.

### Limits

- Sites that build all styles in JavaScript at runtime (CSS-in-JS with no stylesheet) or block bots may return few colours or fonts; the row then has a `note`.
- Font names are the CSS family names the site uses (e.g. `sohne-var`), which can differ from the marketing name.
- Logos and fonts are trademarks of their owners; use the output for analysis, outreach and internal tools, not to impersonate a brand.

# Actor input Schema

## `urls` (type: `array`):

Website or page URLs to extract the brand kit from (home pages work best). A bare domain like `stripe.com` becomes `https://stripe.com`. Duplicates are removed. One dataset row per URL.

## `checkLogos` (type: `boolean`):

Download the first 64 KB of each logo/icon candidate to report format and pixel size, and drop broken ones. Included in the price.

## `includeLogoSvg` (type: `boolean`):

When the site draws its logo as inline <svg> in the header, return the SVG markup in `logoSvg` (up to 60 KB).

## `includeColorTokens` (type: `boolean`):

Return CSS custom properties that hold colours (e.g. `--brand-primary: #635bff`), ranked by how often the site uses them. Handy for design systems and Tailwind themes.

## `maxBrandColors` (type: `integer`):

How many non-neutral brand colours to return (most used first; declared theme colours first).

## `maxStylesheets` (type: `integer`):

How many linked CSS files (plus @import) to read per site. More = more complete palette and fonts, slightly slower. 0 = only the HTML's inline CSS.

## `maxUrls` (type: `integer`):

Process at most this many URLs from the list (0 = all).

## `respectRobotsTxt` (type: `boolean`):

Skip URLs that the site's robots.txt disallows for crawlers (also honours Crawl-delay). Skipped URLs are reported and not charged. Turn off only for your own sites.

## `maxConcurrency` (type: `integer`):

How many URLs are processed at the same time overall.

## `maxRequestsPerHost` (type: `integer`):

Politeness limit when many URLs share one host.

## `requestTimeoutSecs` (type: `integer`):

Per-request timeout. Timeouts, 429 and 5xx responses are retried.

## `maxRetries` (type: `integer`):

Retries per URL on network errors, 429 and 5xx (with backoff).

## `userAgent` (type: `string`):

Optional. By default an honest bot User-Agent with a contact address is sent.

## `proxyConfiguration` (type: `object`):

Optional. Use a proxy only for sites that block datacenter IPs.

## Actor input object example

```json
{
  "urls": [
    "https://stripe.com",
    "https://www.shopify.com",
    "https://mailchimp.com"
  ],
  "checkLogos": true,
  "includeLogoSvg": true,
  "includeColorTokens": true,
  "maxBrandColors": 8,
  "maxStylesheets": 8,
  "maxUrls": 0,
  "respectRobotsTxt": true,
  "maxConcurrency": 10,
  "maxRequestsPerHost": 2,
  "requestTimeoutSecs": 20,
  "maxRetries": 2,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `brand` (type: `string`):

No description

## `palette` (type: `string`):

No description

## `fonts` (type: `string`):

No description

## `assets` (type: `string`):

No description

## `results` (type: `string`):

No description

## `summary` (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 = {
    "urls": [
        "https://stripe.com",
        "https://www.shopify.com",
        "https://mailchimp.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("gazidev/website-brand-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 = { "urls": [
        "https://stripe.com",
        "https://www.shopify.com",
        "https://mailchimp.com",
    ] }

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

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,gazidev/website-brand-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/I1yoDjL74Qf4n1RTn/builds/eGhtJaloCC12rMhiM/openapi.json
