# Font Detector (`maximedupre/font-detector`) Actor

Detect fonts used on public web pages. Export Google Fonts, Adobe Fonts, custom font files, preload links, CSS family declarations, source evidence, and counts.

- **URL**: https://apify.com/maximedupre/font-detector.md
- **Developed by:** [Maxime Dupré](https://apify.com/maximedupre) (community)
- **Categories:** Developer tools, SEO tools, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $0.50 / 1,000 font analyses

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

### 🔎 Detect website fonts from public pages

Font Detector analyzes public web pages and shows which web fonts they use. Add URLs or domains, and the Actor returns loaded font files, Google Fonts links, Adobe Fonts kit IDs, custom `@font-face` sources, preload font URLs, CSS `font-family` declarations, counts, and page metadata.

Use it for website typography audits, redesign research, brand QA, design-system checks, migration planning, competitor font research, and recurring checks across client or portfolio sites. You can run it from Apify Console, API, schedules, webhooks, or integrations, then export the dataset as JSON, CSV, Excel, XML, RSS, or HTML.

For a quick first run, keep the prefilled pages: [Apple](https://www.apple.com), [Google Fonts](https://fonts.google.com), and [Wikipedia](https://www.wikipedia.org). You can also paste clean domains like `stripe.com` or full page URLs like `https://example.com/pricing`.

### 🧭 What this font detector does

- Detects loaded web fonts from public HTML pages and stylesheets.
- Finds Google Fonts URLs and font families.
- Finds Adobe Fonts and Typekit kit IDs when they are present in the page or CSS.
- Extracts custom `@font-face` font files and source URLs.
- Captures font preload links from page HTML.
- Collects CSS `font-family` declarations, including fallback stacks and system fonts.
- Adds counts for loaded, declared, Google, Adobe, custom, and system fonts.
- Keeps source evidence so you can trace where a font was found.
- Marks partial results when some stylesheets could not be loaded.

The Actor is built for public website pages. It does not require website credentials, design-file access, a browser extension, or a Google Fonts API key.

### 📊 What data you get

Each dataset item is one successfully analyzed page. Rows can include:

- `inputUrl`: the URL or domain you submitted.
- `finalUrl`: the final resolved page URL.
- `inputIndex`: the input order for the submitted target.
- `status`: `ok` or `partial`.
- `httpStatusCode`: the page response status code.
- `title`: the page title when found.
- `fontCount`: total detected font entries.
- `loadedFontCount`: detected non-system font entries.
- `declaredFamilyCount`: CSS font-family declaration count.
- `googleFontCount`, `adobeFontCount`, `customFontCount`, `systemFamilyCount`: source and family counts.
- `fonts`: detected font entries with family, source type, source URLs, format, weight, style, and classification flags.
- `fontFamiliesInCss`: CSS font-family values when enabled.
- `googleFontsUrls`, `adobeKitIds`, `stylesheetUrls`, `preloadFontUrls`, `fontFaceSources`: optional source evidence.
- `degradedReason`: why a partial row may be incomplete.
- `checkedAt`: ISO timestamp for the analysis.

### 🚀 How to run it

1. Add one or more public pages or domains.
2. Keep the default page limit for a small first audit, or lower it when testing a new list.
3. Leave CSS declarations and font evidence enabled if you want the most traceable output.
4. Run the Actor and open the dataset.

The Actor accepts both domains and full URLs. For example:

- `apple.com`
- `https://fonts.google.com`
- `https://www.wikipedia.org`

If a page cannot be loaded, the Actor logs a warning and continues with the remaining targets. If a page loads but some stylesheets do not, the row is still saved with `status: "partial"` and a `degradedReason`.

### 🧾 Input

#### Targets

Enter one page URL or domain per line. Use public pages that can be opened without logging in.

```json
{
	"targets": [
		"https://www.apple.com",
		"https://fonts.google.com",
		"https://www.wikipedia.org"
	],
	"maxPages": 25,
	"includeCssFamilyDeclarations": true,
	"includeFontEvidence": true,
	"requestTimeoutSecs": 20
}
````

#### Output detail

Keep `includeCssFamilyDeclarations` enabled when you want fallback stacks and system-family declarations. Keep `includeFontEvidence` enabled when you want stylesheet URLs, preload URLs, Google Fonts URLs, Adobe kit IDs, and font-file sources for audit trails.

### 📦 Output example

```json
{
	"inputUrl": "https://fonts.google.com",
	"finalUrl": "https://fonts.google.com/",
	"inputIndex": 2,
	"status": "ok",
	"httpStatusCode": 200,
	"title": "Google Fonts",
	"fontCount": 12,
	"loadedFontCount": 8,
	"declaredFamilyCount": 16,
	"googleFontCount": 8,
	"adobeFontCount": 0,
	"customFontCount": 0,
	"systemFamilyCount": 4,
	"fonts": [
		{
			"family": "Roboto",
			"sourceType": "google-fonts",
			"sourceUrl": "https://fonts.gstatic.com/s/roboto/example.woff2",
			"sourceCssUrl": "https://fonts.googleapis.com/css2?family=Roboto",
			"format": "woff2",
			"weight": "400",
			"style": "normal",
			"isGoogleFont": true,
			"isAdobeFont": false,
			"isCustomFont": false,
			"isSystemFont": false
		}
	],
	"fontFamiliesInCss": ["Roboto", "Arial", "sans-serif"],
	"googleFontsUrls": ["https://fonts.googleapis.com/css2?family=Roboto"],
	"adobeKitIds": [],
	"stylesheetUrls": ["https://fonts.googleapis.com/css2?family=Roboto"],
	"preloadFontUrls": [],
	"fontFaceSources": ["https://fonts.gstatic.com/s/roboto/example.woff2"],
	"checkedAt": "2026-05-25T00:00:00.000Z"
}
```

Some fields can be empty because websites do not expose every font source in the same way.

### 💳 Pricing

Font Detector uses pay-per-event pricing. You are charged for each successfully analyzed public page, starting at `$0.001` per page on the FREE tier, with lower per-page prices on higher Apify usage tiers.

There is no separate charge for skipped pages that fail before a dataset item is saved.

### ⚠️ Limits and caveats

- The Actor analyzes public HTML pages and linked stylesheets. Login-only pages are not supported.
- JavaScript-injected fonts may be missed when they are not present in the fetched HTML or CSS.
- Some websites block or delay stylesheet files. In that case, the Actor can still save a partial page analysis.
- CSS `font-family` declarations can include fallback and system fonts that are declared but not necessarily downloaded.
- Font source URLs and formats depend on what the website exposes in HTML and CSS.

### ❓ FAQ

#### Can I use this as a website font checker API?

Yes. Run the Actor through the Apify API, pass `targets`, and read the dataset items when the run finishes.

#### Does it detect Google Fonts?

Yes. It detects Google Fonts URLs and font entries exposed through page HTML and CSS.

#### Does it detect Adobe Fonts?

Yes, when Adobe Fonts or Typekit kit IDs are visible in the page or stylesheet content.

#### Will every CSS family be a loaded font?

No. CSS family declarations often include fallback stacks and system fonts. Use `loadedFontCount`, source flags, and source evidence to separate downloaded fonts from declared families.

### 📝 Changelog

- 0.1: Initial release.

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~font-detector/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Other actors

- [Website Emails Scraper ↗](https://apify.com/maximedupre/website-emails-scraper) - Find public contact emails from websites you are already auditing.
- [Business Address Scraper ↗](https://apify.com/maximedupre/business-address-scraper) - Extract physical business addresses from company websites.
- [Google Shopping Ads Scraper ↗](https://apify.com/maximedupre/google-shopping-ads-scraper) - Collect live sponsored product ads from Google Search.
- [LinkedIn Company Scraper ↗](https://apify.com/maximedupre/linkedin-company-scraper) - Export company profile data for business research workflows.
- [Unsplash Image Scraper ↗](https://apify.com/maximedupre/unsplash-image-scraper) - Scrape image search results for design and content research.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

## `targets` (type: `array`):

Enter one public page URL or domain per line, such as apple.com, https://fonts.google.com, or https://www.wikipedia.org. Login-only pages are not supported.

## `maxPages` (type: `integer`):

Maximum number of submitted targets to analyze. Use a small limit for a quick first website font audit.

## `includeCssFamilyDeclarations` (type: `boolean`):

Include font-family values found in page and stylesheet CSS, including fallback stacks and system fonts that may be declared but not downloaded.

## `includeFontEvidence` (type: `boolean`):

Include stylesheet URLs, preload URLs, Google Fonts URLs, Adobe kit IDs, and font-file sources that explain where detected fonts came from.

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

Maximum seconds to wait for each public page or stylesheet request before moving on.

## Actor input object example

```json
{
  "targets": [
    "https://www.apple.com",
    "https://fonts.google.com",
    "https://www.wikipedia.org"
  ],
  "maxPages": 100,
  "includeCssFamilyDeclarations": true,
  "includeFontEvidence": true,
  "requestTimeoutSecs": 20
}
```

# Actor output Schema

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

Open the dataset to view website font detector results.

# 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 = {
    "targets": [
        "https://www.apple.com",
        "https://fonts.google.com",
        "https://www.wikipedia.org"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/font-detector").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 = { "targets": [
        "https://www.apple.com",
        "https://fonts.google.com",
        "https://www.wikipedia.org",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/font-detector").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "targets": [
    "https://www.apple.com",
    "https://fonts.google.com",
    "https://www.wikipedia.org"
  ]
}' |
apify call maximedupre/font-detector --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=maximedupre/font-detector",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Font Detector",
        "description": "Detect fonts used on public web pages. Export Google Fonts, Adobe Fonts, custom font files, preload links, CSS family declarations, source evidence, and counts.",
        "version": "0.1",
        "x-build-id": "uHUmEcarvPjEdRGth"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/maximedupre~font-detector/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-maximedupre-font-detector",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/maximedupre~font-detector/runs": {
            "post": {
                "operationId": "runs-sync-maximedupre-font-detector",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/maximedupre~font-detector/run-sync": {
            "post": {
                "operationId": "run-sync-maximedupre-font-detector",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "targets"
                ],
                "properties": {
                    "targets": {
                        "title": "Target pages",
                        "minItems": 1,
                        "maxItems": 1000,
                        "type": "array",
                        "description": "Enter one public page URL or domain per line, such as apple.com, https://fonts.google.com, or https://www.wikipedia.org. Login-only pages are not supported.",
                        "items": {
                            "type": "string",
                            "minLength": 1
                        }
                    },
                    "maxPages": {
                        "title": "Page limit",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Maximum number of submitted targets to analyze. Use a small limit for a quick first website font audit.",
                        "default": 100
                    },
                    "includeCssFamilyDeclarations": {
                        "title": "CSS family declarations",
                        "type": "boolean",
                        "description": "Include font-family values found in page and stylesheet CSS, including fallback stacks and system fonts that may be declared but not downloaded.",
                        "default": true
                    },
                    "includeFontEvidence": {
                        "title": "Font source evidence",
                        "type": "boolean",
                        "description": "Include stylesheet URLs, preload URLs, Google Fonts URLs, Adobe kit IDs, and font-file sources that explain where detected fonts came from.",
                        "default": true
                    },
                    "requestTimeoutSecs": {
                        "title": "Request timeout",
                        "minimum": 5,
                        "maximum": 60,
                        "type": "integer",
                        "description": "Maximum seconds to wait for each public page or stylesheet request before moving on.",
                        "default": 20
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
