Keyword Density Checker - Words, Bigrams & Trigrams per Page avatar

Keyword Density Checker - Words, Bigrams & Trigrams per Page

Pricing

from $1.60 / 1,000 analyzed pages

Go to Apify Store
Keyword Density Checker - Words, Bigrams & Trigrams per Page

Keyword Density Checker - Words, Bigrams & Trigrams per Page

Checks keyword density on one page URL or up to 50, after stripping nav, footer and boilerplate. Returns top keywords and 2-word and 3-word phrases with counts, density % and 1-100 word-cloud weights; failed fetches are free. For SEO writers, content editors, agencies and marketers.

Pricing

from $1.60 / 1,000 analyzed pages

Rating

0.0

(0)

Developer

Broke to Built

Broke to Built

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

14 days ago

Last modified

Features

Limited permissions

Share

Webpage Keyword Density — Main-Content SEO Analysis + Word-Cloud Weights

Send a URL, get the most used words and 2- and 3-word phrases in its main content with density %, after navigation and footer text is stripped.

You give itYou get backYou pay (Free plan)
One URL or a list of up to 50Word count, top keywords and phrases with count, density % and 1-100 word-cloud weight$0.002 per page

Pay per result only: no subscription, no start fee. Unreachable pages and HTTP errors are not charged. Paid Apify plans get Store discounts on the price above.

Example: 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://en.wikipedia.org/wiki/Search_engine_optimization"
}

Real output from that exact input (run on 2026-09-24; long arrays shortened to a few entries and long text cut for display):

[
{
"url": "https://en.wikipedia.org/wiki/Search_engine_optimization",
"ok": true,
"status": 200,
"extraction": {
"usedScope": "main",
"boilerplateBlocksRemoved": 6
},
"wordCount": 3371,
"totalTokens": 5506,
"topKeywords": [
{
"term": "search",
"count": 183,
"densityPct": 5.429,
"weight": 100
},
{
"term": "google",
"count": 84,
"densityPct": 2.492,
"weight": 46
}
],
"topBigrams": [
{
"term": "search engine",
"count": 69,
"densityPct": 2.047
},
{
"term": "search engines",
"count": 33,
"densityPct": 0.979
}
],
"topTrigrams": [
{
"term": "search engine optimization",
"count": 14,
"densityPct": 0.415
},
{
"term": "search engine watch",
"count": 10,
"densityPct": 0.297
}
]
}
]

What does this page actually rank for? Fetch any URL and get keyword density of its main content — nav, header, footer and sidebar boilerplate stripped first, semantic <main>/<article> preferred — as ranked unigrams, bigrams and trigrams with exact density percentages, plus 1-100 weights ready to feed a word-cloud renderer. Up to 50 URLs per run, online, by API, or as an agent tool via Apify MCP.

The extraction step matters: run density on a raw page and "menu", "login" and "privacy policy" pollute the table. Here the percentages describe the content search engines index — and every record reports which region was analyzed.

Analyzing pasted text for topical phrases instead? Use our sibling Text Keyword Extractor — RAKE phrase extraction, no fetching, cheaper per item.

What you get

  • topKeywords — unigrams: {term, count, densityPct, weight} — weight is 1-100 scaled to the top term, plug it straight into any word-cloud library
  • topBigrams / topTrigrams — multi-word phrases with counts + density percentages (the real SEO signal)
  • extraction — usedScope + boilerplateBlocksRemoved: proof of what was analyzed
  • wordCount / totalTokens of the extracted content
  • Fail-soft: an unfetchable URL or HTTP error page never fails the run — {ok: false, error}, never charged.

Input

{ "url": "https://yoursite.com/landing-page", "topN": 30, "minLength": 3 }

Bulk: { "urls": ["...", "..."], "maxUrls": 50 }

Output (real run, trimmed)

{
"url": "https://en.wikipedia.org/wiki/Search_engine_optimization",
"ok": true,
"extraction": { "usedScope": "main", "boilerplateBlocksRemoved": 6 },
"wordCount": 3400,
"topKeywords": [
{ "term": "search", "count": 112, "densityPct": 3.294, "weight": 100 },
{ "term": "seo", "count": 54, "densityPct": 1.588, "weight": 48 }
],
"topBigrams": [{ "term": "search engine", "count": 71, "densityPct": 2.088 }],
"topTrigrams": [{ "term": "search engine optimization", "count": 21, "densityPct": 0.617 }]
}

Pricing

$0.002 per page analyzed — fetch + main-content extraction + all three n-gram tables + weights. No start fee. Unfetchable and error pages are never charged.

Measured against store incumbents (2026-08-07): easyapi/keyword-density-checker charges $0.09 start + $0.00299 per item, andok/keyword-density-analyzer $0.01 start + $0.001 per item. One page here costs $0.002 vs $0.011-$0.093 there.

Honest limits

  • Static HTML fetch — JS-rendered pages (empty-shell SPAs) yield little text and report low word counts honestly.
  • Main-content extraction is heuristic (semantic tags + boilerplate removal, no headless browser); div-soup pages fall back to whole-body-minus-boilerplate — extraction.usedScope always says which happened.
  • English stopword list; density on other Latin-script languages works, but stopword filtering is English-tuned.
  • Density describes the page as served — it is a diagnostic, not a target ("2% keyword density" folklore is not a ranking factor; the bigram/trigram tables showing what the page emphasizes are the useful part).

FAQ

How is this different from your Text Keyword Extractor? This owns the URL problem: fetching, HTTP handling, main-content extraction, density percentages against the page's word count, and n-gram tables. The text sibling does RAKE phrase extraction on text you already have.

Can I build a word cloud from this? Directly — topKeywords[].weight is the normalized 1-100 size value cloud renderers take. No separate word-cloud tool needed.

Why bigrams and trigrams? Single-word density is noise for SEO; "search engine optimization" appearing 21 times is signal. Phrase tables show what the page actually emphasizes.

Can I compare my page against a competitor's? Run both URLs in one batch and diff the tables — that is the fastest content-gap check there is.

Why did some rows come back ok: false? DNS/timeout failures or HTTP 4xx/5xx — error pages are not analyzed. Recorded, never charged.

Use from code or AI agents

curl -s "https://api.apify.com/v2/acts/EliAI~webpage-keyword-density/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-X POST -H 'Content-Type: application/json' \
-d '{"urls": ["https://yoursite.com/page", "https://competitor.com/page"]}'

Agents: connect Apify MCP and call the EliAI/webpage-keyword-density tool.

  • Capability: fetch URLs, extract main content, compute uni/bi/tri-gram keyword density + word-cloud weights
  • Required input: url (string) or urls (array)
  • Returns: one record per URL; topKeywords/topBigrams/topTrigrams + extraction summarize it
  • Bounded: 50 URLs per run, topN up to 200; failures isolate per URL
  • Side effects: none (one GET per page)

For AI agents

This Actor is built to be called by software, not just by people.

  • Mount it directly as an MCP tool — no Store search, no ranking, just this one tool: https://mcp.apify.com/?actors=eliai/webpage-keyword-density
  • Or call it over HTTP and get the results in the same request: POST https://api.apify.com/v2/acts/eliai~webpage-keyword-density/run-sync-get-dataset-items
  • Costs are predictable before you call. Pricing is pay-per-event (see Pricing above), so an agent can budget a run in advance instead of discovering the bill afterwards.
  • Send only the field you mean. If you pass the bulk field, it is used on its own; the single-value field is a fallback, never merged into your request. You are charged for the items you sent and nothing else.

Who uses it

  • SEO writers checking which bigrams and trigrams dominate a competitor's ranking page
  • Content editors spotting over-repeated terms in a draft after it goes live
  • Agencies comparing main-content keyword density across the top pages for a query
  • Designers generating word clouds for a page from the returned 1-100 weights
  • Marketers checking a landing page mentions its target phrase, excluding nav and footer text

Changelog

  • 2026-11-01: Page text only: the "Try it" block is now headed Example. Code, output and price are 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.