# Website Brand Identity Scraper (`automation-lab/website-brand-identity-extractor`) Actor

Analyze public company websites for source-attributed logos, imagery, colors, fonts, messaging, calls to action, and evidence-based brand themes and tone.

- **URL**: https://apify.com/automation-lab/website-brand-identity-extractor.md
- **Developed by:** [Stas Persiianenko](https://apify.com/automation-lab) (community)
- **Categories:** Marketing, Lead generation
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.42 / 1,000 item extracteds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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 Identity Scraper

Turn public company websites into normalized **website brand identity** records for CRM enrichment, creative research, and brand audits. Supply one or many URLs and receive source-attributed logo and image candidates, CSS colors, font declarations, messaging, calls to action, and deterministic theme and tone signals.

The Actor uses public HTML and linked CSS. It does not invent a brand book, use private accounts, or present heuristic labels as facts. Every asset, color, and font retains the page or stylesheet where it was found; derived themes and tone include evidence and confidence.

### What does Website Brand Identity Scraper extract?

Each successful website produces one record containing:

| Group | Fields |
| --- | --- |
| Identity | site name, input URL, final URL, domain |
| Logos | ranked logo/favicon candidates, source URL, source type, label, confidence |
| Imagery | Open Graph, Twitter, hero, and content image candidates |
| Color palette | frequent CSS hex, RGB, and HSL values with occurrence counts and sources |
| Fonts | font family, original declaration, and source page or stylesheet |
| Messaging | title, meta description, H1/H2 headings, tagline candidates, calls to action |
| Derived identity | brand themes and messaging tone with evidence and bounded confidence |
| Provenance | all successfully analyzed page and stylesheet URLs, analysis timestamp |

Failed websites still produce an uncharged `status: failed` record. This preserves one-to-one traceability in bulk enrichment jobs.

### Who is it for?

- Revenue operations teams enriching company and account records.
- Creative teams preparing references before a campaign or redesign.
- Agencies comparing visual identity and calls to action across client websites.
- Data teams building source-attributed brand datasets.
- Developers who need structured website brand guidelines inputs without manual copy-and-paste.

### Why use this website brand identity extractor?

Unlike a logo-only utility, this Actor combines visual candidates with messaging and evidence-based derived signals. Unlike a generative brand kit, it reports what the public website exposes and keeps provenance. One successful website incurs one item charge regardless of how many logo, color, font, image, or messaging candidates it contains.

### Getting started

1. Open the Actor input.
2. Add public company homepages to **Website URLs**.
3. Choose the maximum number of websites.
4. Keep the stylesheet limit at 8 for normal analysis, increase it for CSS-heavy sites, or set it to 0 for HTML-only analysis.
5. Start the run and open the default dataset.
6. Filter `status` to separate successful analyses from failures.

### Input parameters

#### `startUrls`

Required array of public HTTP or HTTPS website URLs. The Actor accepts request-list objects and deduplicates exact normalized inputs. URLs containing credentials, local hosts, and private or reserved network addresses are rejected.

#### `maxItems`

Maximum unique websites to analyze, from 1 to 100. Processing follows input order.

#### `maxStylesheetsPerWebsite`

Maximum linked CSS files to fetch per website, from 0 to 20. A higher value can discover more fonts and colors but takes longer. Failed stylesheet requests are skipped while the page analysis continues.

### Example input

```json
{
  "startUrls": [
    { "url": "https://stripe.com" },
    { "url": "https://slack.com" },
    { "url": "https://www.hubspot.com" }
  ],
  "maxItems": 3,
  "maxStylesheetsPerWebsite": 8
}
```

### Example output

The arrays below are shortened; actual records may contain more candidates.

```json
{
  "inputUrl": "https://stripe.com/",
  "finalUrl": "https://stripe.com/de",
  "domain": "stripe.com",
  "status": "ok",
  "error": null,
  "siteName": "Online-Bezahldienst und Zahlungsdienstleister | Stripe",
  "logos": [
    {
      "url": "https://images.stripeassets.com/example/favicon.svg",
      "sourceUrl": "https://stripe.com/de",
      "sourceType": "icon-link",
      "label": null,
      "confidence": 0.68
    }
  ],
  "colors": [
    {
      "value": "#635bff",
      "occurrences": 12,
      "sourceUrls": ["https://stripe.com/example.css"]
    }
  ],
  "fonts": [],
  "messaging": {
    "title": "Online-Bezahldienst und Zahlungsdienstleister | Stripe",
    "metaDescription": "Financial infrastructure for the internet.",
    "headings": ["Financial infrastructure to grow your revenue"],
    "taglines": [],
    "callsToAction": ["Start now"]
  },
  "themes": [{ "label": "growth", "confidence": 0.57, "evidence": ["grow"] }],
  "tone": [{ "label": "direct", "confidence": 0.57, "evidence": ["start"] }],
  "sourceUrls": ["https://stripe.com/de"],
  "analyzedAt": "2026-01-15T12:00:00.000Z"
}
```

URLs can redirect according to geography, so text and source URLs may differ between runs.

### How are confidence and evidence calculated?

Confidence is deterministic, not an AI probability. HTML logo candidates must combine brand-name evidence with explicit logo/brandmark structure or a home-linked header position; long descriptive labels, photographic assets, and product/icon clues are penalized. Explicit logo metadata ranks highest, while favicons are retained at moderate confidence. Social metadata receives high image confidence. Theme and tone confidence increases only when configured evidence terms occur in extracted messaging.

Treat candidates as ranked leads. Confirm selected assets before publishing creative work, especially when a homepage exposes several brand variants.

### How much does it cost to analyze website brand identity?

The PPE schedule charges **$0.001 per run** plus the active tier price for each successfully analyzed website. At the BRONZE tier, a successful website is **$0.00236**.

Example BRONZE totals:

| Successful websites | Estimated Actor charge |
| ---: | ---: |
| 1 | $0.00336 |
| 10 | $0.02460 |
| 100 | $0.23700 |

Failed website rows have no item charge. The Apify Console displays the active tier and exact run charge before and after execution. The six usage tiers decrease from FREE through DIAMOND; Apify applies the tier associated with the user's plan.

### CRM enrichment workflow

Map company website fields into `startUrls`, run the Actor in batches, and join results back on `inputUrl` or `domain`. Store `status`, `error`, and `analyzedAt` so retries are explicit. Flatten colors, fonts, themes, or calls to action only when your destination system needs scalar fields.

### Creative benchmarking workflow

Use logo and image candidates as an evidence queue, compare the most frequent colors, and review font sources before downloading any asset. Messaging headings and CTA arrays help compare positioning without treating every page link as a CTA.

### Monitoring and change detection

Schedule an Apify Task with the same URL list, export each dataset, and compare normalized fields in your data warehouse or automation tool. The Actor returns current observations; it does not itself send alerts, retain prior snapshots, or claim that every detected difference is a deliberate rebrand.

### API usage with cURL

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/automation-lab~website-brand-identity-extractor/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"startUrls":[{"url":"https://stripe.com"}],"maxItems":1}'
```

### API usage with JavaScript

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/website-brand-identity-extractor').call({
  startUrls: [{ url: 'https://stripe.com' }],
  maxItems: 1,
  maxStylesheetsPerWebsite: 8,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### API usage with Python

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("automation-lab/website-brand-identity-extractor").call(run_input={
    "startUrls": [{"url": "https://stripe.com"}],
    "maxItems": 1,
})
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items)
```

### Use with MCP and AI assistants

Add the Apify MCP server to Claude Code:

```bash
claude mcp add --transport http apify \
  "https://mcp.apify.com?tools=automation-lab/website-brand-identity-extractor"
```

Claude Desktop, Cursor, and VS Code can use the same HTTP MCP configuration. Add this JSON in the client-specific MCP settings panel:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=automation-lab/website-brand-identity-extractor"
    }
  }
}
```

Example prompts:

- “Analyze Stripe and Slack and compare their top CSS colors and calls to action.”
- “Extract source-attributed website brand identity fields for these CRM company URLs.”
- “Show only failed websites and explain which URLs should be retried.”

### Limits and failure behavior

- The Actor analyzes the supplied page, usually a homepage; it does not crawl an entire domain.
- Client-rendered-only text, canvas content, and runtime CSS may be absent from SSR HTML.
- Protected, login-only, CAPTCHA, or rate-limited pages may return `status: failed`.
- CSS variables without literal color values are not resolved through a browser rendering engine.
- Logo candidates are precision-filtered, but ambiguous brand variants can remain; use confidence, label, source, and human review.
- Theme and tone labels cover a bounded vocabulary and are not a complete brand strategy assessment.
- Images and fonts are referenced, not downloaded or relicensed.

If every website fails, the run exits as failed after writing diagnostic rows. If at least one succeeds, useful and failed rows remain available together.

### Responsible use and legality

Analyze only public websites you are authorized to access. Respect website terms, robots guidance where applicable, intellectual-property rights, and local law. A public asset URL does not grant permission to reuse a logo, image, font, or copy. Keep source attribution and obtain the required license or brand approval before commercial reuse.

### Troubleshooting

#### Why are colors or fonts empty?

The site may load style values at runtime, use CSS variables without literal values, block stylesheet requests, or exceed the configured stylesheet limit. Increase `maxStylesheetsPerWebsite` within the supported limit, then inspect `sourceUrls`.

#### Why does the final URL use another locale?

Some sites redirect based on network geography or cookies. The Actor records both `inputUrl` and `finalUrl`; messaging reflects the final public page actually analyzed.

#### Why are there multiple logos?

Modern homepages often expose header marks, dark/light variants, and favicons. The Actor precision-filters company candidates and intentionally returns evidence rather than claiming certainty. Sort by confidence and check labels and source URLs.

#### Are failed websites charged?

The one-time start event still applies, but failed website rows do not emit the per-website item event.

### Related Automation Lab actors

- [Website Image Extractor](https://apify.com/automation-lab/website-image-extractor) for exhaustive image-level rows and deeper page crawling.
- [JavaScript Website Contact Extractor](https://apify.com/automation-lab/javascript-website-contact-extractor) for source-attributed public contact details on rendered websites.
- [Company Leadership Scraper](https://apify.com/automation-lab/company-leadership-contact-finder) for public leadership and role enrichment.

### FAQ

#### Does this generate website brand guidelines?

It produces structured evidence that can support a brand audit or style-guide workflow. It does not generate an authoritative brand manual or replace a designer.

#### Does it use AI?

No. Extraction and derived labels are deterministic. Evidence terms are included so users can review every theme and tone signal.

#### Can I analyze more than 100 websites?

Split larger lists across Tasks or API runs. The per-run cap keeps fetches bounded and makes failures easier to retry.

#### Can it scrape private brand portals?

No. Only anonymous public HTTP and HTTPS pages are supported; credentials in URLs and private network addresses are rejected.

# Actor input Schema

## `startUrls` (type: `array`):

Public HTTP or HTTPS company websites to analyze. One result row is returned per unique URL, including an uncharged failure row when a site cannot be fetched.

## `maxItems` (type: `integer`):

Maximum number of unique websites to analyze from the supplied list.

## `maxStylesheetsPerWebsite` (type: `integer`):

Maximum linked CSS files to inspect for color and font declarations. Set to 0 for HTML and inline CSS only.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://stripe.com"
    },
    {
      "url": "https://slack.com"
    },
    {
      "url": "https://www.hubspot.com"
    }
  ],
  "maxItems": 10,
  "maxStylesheetsPerWebsite": 8
}
```

# Actor output Schema

## `dataset` (type: `string`):

Open all extracted brand identity records in the default dataset.

# 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 = {
    "startUrls": [
        {
            "url": "https://stripe.com"
        },
        {
            "url": "https://slack.com"
        },
        {
            "url": "https://www.hubspot.com"
        }
    ],
    "maxItems": 10,
    "maxStylesheetsPerWebsite": 8
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/website-brand-identity-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 = {
    "startUrls": [
        { "url": "https://stripe.com" },
        { "url": "https://slack.com" },
        { "url": "https://www.hubspot.com" },
    ],
    "maxItems": 10,
    "maxStylesheetsPerWebsite": 8,
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/website-brand-identity-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 '{
  "startUrls": [
    {
      "url": "https://stripe.com"
    },
    {
      "url": "https://slack.com"
    },
    {
      "url": "https://www.hubspot.com"
    }
  ],
  "maxItems": 10,
  "maxStylesheetsPerWebsite": 8
}' |
apify call automation-lab/website-brand-identity-extractor --silent --output-dataset

```

## MCP server setup

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