Website Font Detector - Fonts Used on Any Page
Pricing
from $0.80 / 1,000 scanned pages
Website Font Detector - Fonts Used on Any Page
Detect the fonts a site uses: @font-face + web-font files, font-family stacks, and Google/Adobe/self-hosted/system sources. Bulk. $0.001 per page, cheaper than paid font/brand extractors; failed fetches free.
Pricing
from $0.80 / 1,000 scanned pages
Rating
0.0
(0)
Developer
Broke to Built
Maintained by CommunityActor stats
0
Bookmarked
4
Total users
2
Monthly active users
4 days ago
Last modified
Categories
Share
Website Font Detector — fonts used on any page
Send a URL, get the fonts the page declares, with the font file URLs and where each comes from (Google Fonts, Adobe, self-hosted, system). Reads the page's HTML and the stylesheets it loads.
| You give it | You get back | You pay (Free plan) |
|---|---|---|
| One URL or a list of up to 25 | Per font: family, source, font files with format | $0.001 per page |
Pay per result only: no subscription, no start fee. Pages that fail to load are not charged. Paid Apify plans get Store discounts on the price above.
Try it in one click
The input form is already filled in with this example. Press Start and you get the output below.
{"url": "https://stripe.com","urls": []}
Real output from that exact input (run on 2026-09-24; long arrays shortened to a few entries and long text cut for display):
[{"ok": true,"url": "https://stripe.com","status": 200,"fontCount": 7,"stylesheetsRead": 5,"fonts": [{"family": "sohne-var","source": "webfont","files": [{"url": "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/media/Sohne.cb178166.woff2","format": "woff2-variations"}]},{"family": "SourceCodePro","source": "webfont","files": [{"url": "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/media/SourceCodePro-Medium.f5ba3e6a.woff2","format": "woff2"}]},{"family": "SF Pro Display","source": "system","files": []}]}]
Measured 2026-09-24, before and after external stylesheets were read: stripe.com 0 → 7 fonts, github.com 0 → 19 (Mona Sans, Hubot Sans, Monaspace Neon with their files), wordpress.org 0 → 12.
Detect the fonts a website uses: @font-face declarations with their web-font files, font-family
stacks, and whether each family comes from Google Fonts, Adobe Fonts, a self-hosted webfont, or the
system. Single URL or bulk. $0.001 per page. Failed fetches are recorded free.
What you get
One dataset item per URL:
| Field | What it is |
|---|---|
ok | true on a successful fetch, false on an error row |
url | The URL you passed |
finalUrl | Where the request actually landed after redirects |
status | HTTP status of the page fetch |
fontCount | How many distinct families were found |
stylesheetsRead | How many external .css files were read for this page |
fonts | Array of { family, source, files[] }, sorted alphabetically by family |
Each font carries family (the declared name), source (webfont, google, adobe or
system), and files - each { url, format } where the format is known. Families seen more than
one way keep the most specific source, so a Google-hosted family is never downgraded to system
just because it also appears in a fallback stack. CSS comments are stripped before parsing, so a
commented-out font-family never shows up as a result.
Example 1 - one page
Input:
{ "url": "https://techcrunch.com", "maxUrls": 25 }
Output (real run, 2026-08-07):
{"ok": true, "url": "https://techcrunch.com/", "status": 200,"fontCount": 3,"fonts": [{ "family": "nb_international_promono", "source": "webfont","files": [ { "url": "https://techcrunch.com/wp-content/themes/tc-24/assets/fonts/.../nbinternationalpromono-webfont.woff2", "format": "woff2" } ] }]}
Example 2 - a competitor sweep in one run
{"urls": ["stripe.com", "linear.app", "vercel.com", "https://notion.so"],"maxUrls": 50}
Bare domains get https:// added for you, duplicates are removed, and you get one row per site -
so a whole competitive set's typography lands in a single dataset you can export as CSV.
Example 3 - a page that will not load
{ "url": "https://no-such-site.invalid", "ok": false, "error": "fetch failed", "fontCount": 0, "fonts": [] }
The row is recorded so nothing silently disappears from your dataset, the run continues, and that URL is not charged.
Pricing — $0.001 per page
Prices below checked via the Apify Store API on 2026-08-07:
| Actor | Pricing | One page |
|---|---|---|
| This actor | $0.001 per page | $0.001 |
| eiv/website-brand-extractor | $0.001 start + $0.002 per item | $0.003 |
| automation-lab/font-detector | $0.035 per run start | $0.035+ |
When NOT to use this
- The page injects its fonts with JavaScript. No browser is launched: the HTML and the
stylesheets it links (up to 15 per page, following
@importtwo levels) are parsed. A single-page app that injects styles at runtime will look emptier here than it does in DevTools. - You want to know which font actually rendered. This reports what the page declares. Which
entry in a
font-familystack the browser picked depends on the visitor's machine. - You want the licence, price or a downloadable file. Family names and file URLs come back; licensing, foundry and pricing do not, and nothing is downloaded.
- You need Adobe Fonts family names. Typekit loads families at runtime via JavaScript, so the
kit is surfaced as
Adobe Fonts kit: <id>with its CSS URL rather than the individual families.
FAQ
How do I find out what font a website uses?
Pass the URL. Every declared family comes back in fonts[] with a source telling you whether it
is a self-hosted webfont, Google Fonts, Adobe Fonts, or a plain system stack.
Can I get the actual font file URL?
Yes, whether the @font-face rule is in the HTML or in a linked stylesheet. files[] holds each
src URL with its declared format (woff2, woff, ttf), resolved to an absolute URL the way a
browser resolves it (against the stylesheet that declared it).
Does it identify Google Fonts and Adobe Fonts?
Yes. Google Fonts are read from fonts.googleapis.com link tags and @import rules, including both
the css2 ?family=A&family=B form and the older ?family=A|B form. Adobe Fonts are detected from
use.typekit.net kit references.
Does it fetch external CSS files?
Yes, since 2026-09-24. Every <link rel="stylesheet"> on the same site or a CDN is read, plus
@import chains two levels deep, bounded at 15 files, 2 MB each and 10 seconds each. It is still
plain HTTP with no headless browser, which is what keeps a scan at $0.001.
Can I check many websites at once?
Yes - up to 50 URLs per run via urls. Bare domains are upgraded to https:// automatically and
duplicates are removed before any fetch happens.
Why does a font show up as "system"?
Because it appeared in a font-family stack but the page never declared a matching @font-face or
provider link, so there is no evidence of a downloadable file. Generic keywords (serif,
sans-serif, system-ui, inherit and friends) are filtered out entirely.
What about a dead URL?
You get an {ok:false, error} record and the run continues. That URL is never charged.
Related actors
- Website Color Palette Extractor (
EliAI/webpage-color-palette) — the color half of a page's design tokens (hex/rgb/hsl ranked). Pair the two to capture a site's full typography + color system.
Use from code or AI agents
curl -X POST "https://api.apify.com/v2/acts/EliAI~webpage-font-detector/runs?token=YOUR_APIFY_TOKEN" \-H 'content-type: application/json' -d '{"url":"https://techcrunch.com"}'
Callable as an agent tool through the Apify MCP server (mcp.apify.com).
Who uses it
- Designers identifying the typeface on a site they want to reference in a brand brief
- Brand managers checking that every campaign microsite loads the licensed font, not a fallback
- Performance engineers counting how many web-font files a page pulls in
- Agencies sweeping competitor homepages to see which font families the category uses
- Privacy reviewers finding pages that still load Google Fonts from Google's servers
Changelog
- 2026-09-24: Now reads the external stylesheets a page loads, including
@font-facerules inside them. stripe.com, github.com and wordpress.org went from 0 fonts to 7, 19 and 12. Also fixed: family names ending in "var" (like Stripe'ssohne-var) were wrongly discarded. NewstylesheetsReadfield. Price unchanged. - 2026-09-24: New summary at the top of this page: what you send, what you get, the price, and a real output from the prefilled example.

