Content Style & Brand Voice Checker avatar

Content Style & Brand Voice Checker

Pricing

$0.01 / 1,000 analyzed words

Go to Apify Store
Content Style & Brand Voice Checker

Content Style & Brand Voice Checker

Audit website copy, documentation, Markdown, HTML, and direct text with Vale. Detect editorial style and terminology issues, enforce brand language, and export structured reports in bulk.

Pricing

$0.01 / 1,000 analyzed words

Rating

0.0

(0)

Developer

DataScraperES

DataScraperES

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 hours ago

Last modified

Share

Content Style & Brand Voice Checker audits website copy, documentation, blog posts, Markdown, HTML, and direct text against deterministic editorial rules and your own terminology policy. Use it to enforce consistent writing style and brand language in bulk, with one structured Dataset item per document containing severity counts, a 0–100 score, and every finding produced by Vale.

What this Actor does

  • Fetches multiple public HTML or plain-text URLs and extracts their readable content.
  • Analyzes direct text, Markdown, HTML, reStructuredText, AsciiDoc, and DocBook XML.
  • Offers technical, marketing, and minimal rule presets.
  • Enforces required terms, forbidden terms, preferred capitalization, replacements, and forbidden phrases.
  • Continues after individual URL failures and records a failed item for each affected document.
  • Stores per-document findings in the Dataset and aggregate totals in the SUMMARY key-value-store record.

This is a deterministic style and terminology checker. It does not infer semantic tone, personality, factual accuracy, or whether content “sounds like” a brand.

Use cases

  • Audit product documentation before publication.
  • Check terminology consistency across a website migration.
  • Find prohibited or outdated language on many pages at once.
  • Enforce product-name capitalization in marketing and support content.
  • Export review evidence to automated content operations or reporting tools.

How to use

  1. Add one or more public URLs, direct text documents, or both.
  2. Choose the style preset that best matches the content.
  3. Add any required, forbidden, replacement, or capitalization rules.
  4. Run the Actor.
  5. Open the Dataset for document-level findings or the SUMMARY record for totals.

The following input was used for the representative output below:

{
"style": "technical",
"texts": [
{
"id": "example-guide",
"format": "markdown",
"text": "# Quick Start.\n\nWe will simply utilize the apify actor. The blacklist is updated by the system."
}
],
"requiredTerms": ["Dataset"],
"preferredCaseTerms": ["Apify", "Actor", "Dataset", "API"],
"forbiddenTerms": [
{ "term": "blacklist", "replacement": "blocklist" }
],
"forbiddenPhrases": ["simply"],
"urls": [],
"fetchTimeoutSeconds": 10,
"maxDownloadMb": 1,
"analysisBatchSize": 10
}

Input

FieldTypeDefaultDescription
urlsstring array[]One public HTTP(S) HTML or plain-text URL per line. Exact duplicates are skipped; JavaScript is not executed.
textsobject array[]JSON documents with required text, optional id, and optional format. Supported formats: text, markdown, html, rst, asciidoc, and xml; each document is limited to 2,000,000 characters.
stylestringtechnicaltechnical uses Google documentation rules, marketing uses write-good readability rules, and minimal applies only sentence-length and terminology checks.
requiredTermsstring array[]Case-insensitive literal terms or phrases that must appear in every document. Each missing entry produces a document-level error.
preferredCaseTermsstring arrayApify, Actor, Dataset, APICanonical spellings used to report lowercase forms such as apify and recommend Apify. The defaults can be edited or cleared.
forbiddenTermsobject array[]JSON objects with term and an optional replacement, such as {"term":"blacklist","replacement":"blocklist"}. Values are literal, not regular expressions.
forbiddenPhrasesstring array[]Case-insensitive literal phrases to report. Regular-expression metacharacters have no special meaning.
fetchTimeoutSecondsinteger10Per-request timeout from 1 to 60 seconds. A timed-out URL becomes a free failed row without stopping other documents.
maxDownloadMbinteger1Maximum response body per URL, from 1 to 9 MiB. Pages exceeding it become free failed rows.
analysisBatchSizeinteger10Fetched URLs retained per Vale pass, from 1 to 100. Lower values use less peak memory; higher values can help many small pages.

At least one URL or text document is required. A run accepts up to 500 documents in total.

Terminology lists accept up to 500 non-empty entries of at most 200 characters. requiredTerms uses case-insensitive literal substring matching. forbiddenTerms must be entered as a JSON array, while the other terminology fields accept one value per line in the Console form.

Output

Every accepted document produces one Dataset item. This is the complete Dataset item from a real successful run using the exact input above:

{
"id": "example-guide",
"sourceType": "text",
"sourceUrl": null,
"finalUrl": null,
"title": null,
"extraction": "provided",
"status": "succeeded",
"words": 16,
"issues": 8,
"counts": { "error": 1, "warning": 6, "suggestion": 1 },
"score": 36,
"lineReference": "original_input",
"results": [
{
"line": 1,
"span": [3, 14],
"severity": "warning",
"rule": "Google.Headings",
"message": "'Quick Start.' should use sentence-style capitalization.",
"match": "Quick Start.",
"action": null
},
{
"line": 1,
"span": [13, 14],
"severity": "warning",
"rule": "Google.HeadingPunctuation",
"message": "Don't put a period at the end of a heading.",
"match": "t.",
"action": { "name": "edit", "params": ["trim_right", "."] }
},
{
"line": 3,
"span": [9, 14],
"severity": "warning",
"rule": "Customer.Forbidden",
"message": "Avoid the custom term 'simply'.",
"match": "simply",
"action": null
},
{
"line": 3,
"span": [28, 32],
"severity": "warning",
"rule": "Customer.PreferredTerms",
"message": "Use 'Apify' instead of 'apify'.",
"match": "apify",
"action": null
},
{
"line": 3,
"span": [34, 38],
"severity": "warning",
"rule": "Customer.PreferredTerms",
"message": "Use 'Actor' instead of 'actor'.",
"match": "actor",
"action": null
},
{
"line": 3,
"span": [45, 53],
"severity": "warning",
"rule": "Customer.PreferredTerms",
"message": "Use 'blocklist' instead of 'blacklist'.",
"match": "blacklist",
"action": null
},
{
"line": 3,
"span": [55, 64],
"severity": "suggestion",
"rule": "Google.Passive",
"message": "In general, use active voice instead of passive voice ('is updated').",
"match": "is updated",
"action": null
},
{
"line": null,
"span": null,
"severity": "error",
"rule": "Product.RequiredTerm",
"message": "Required term 'Dataset' is missing.",
"match": null,
"action": null
}
],
"error": null,
"style": "technical",
"engine": { "name": "Vale", "version": "3.18.0", "style": "technical" },
"chargedWords": 16
}

For direct content, line and span refer to the original supplied document. For URLs, they refer to the extracted readable content, not the page source or CMS editor. chargedWords shows the exact number of words billed for that row. Failed documents have status: "failed", an error message, zero counts, an empty results array, and chargedWords: 0.

The SUMMARY record contains the overall status, document and word totals, severity counts, issue totals grouped by rule, duplicate URL count, engine details, analysis duration, and a billing breakdown with eligible words, charged words, estimated charge, and charge-limit status.

Pricing

The Actor uses flat pay-per-event billing based only on words in successfully analyzed documents.

Successfully analyzed contentPrice
1 word$0.00001
1,000 words$0.01
100,000 words$1.00
  • There is no Actor-start charge.
  • There are no pricing tiers.
  • Apify platform usage is included and is not billed separately to the customer.
  • Failed, empty, unsupported, and charge-limit-skipped documents have chargedWords: 0.
  • Before processing a paid document, the Actor checks that the remaining run budget can cover every word. If not, it publishes a skipped status without findings and without charging any part of that document.

The charged word count is visible in each Dataset row as chargedWords and in the SUMMARY record. The Actor's Pricing tab remains the source of truth for the active Store price.

API and integrations

You can run the Actor from Apify Console, the Apify API, schedules, webhooks, or integrations. Dataset items are available through the standard Dataset API, while aggregate totals are available from the default key-value store under the SUMMARY key.

Typical automation flow:

  1. Send the same JSON input shown in Console to the Actor run endpoint.
  2. Wait for the run to finish.
  3. Read document rows from the default Dataset.
  4. Read aggregate totals from the SUMMARY record.
ActorBest for
PDF Text Extractor - OCR, Markdown & JSONExtract PDF content as text or Markdown before applying a terminology audit.
Bulk Website Screenshot & PDF GeneratorCapture visual evidence of the pages included in a content review.
Website Technology Lookup – CMS, Hosting & Tech Stack DataAdd CMS and technology context to the websites you are auditing.

Limits and data quality

  • The default presets contain English editorial rules. Terminology checks can match other languages, but multilingual grammar and spelling are not claimed.
  • URL mode supports server-rendered public HTML and plain text. It does not execute page JavaScript or discover an entire site automatically.
  • Readability extraction may omit navigation, footers, cookie banners, or other non-article content.
  • URLs resolving to private or unsupported network addresses are rejected. Redirects, response types, request time, and download size are limited.
  • The score is a deterministic 0–100 severity-and-word-count heuristic. Use the individual findings for editorial decisions.
  • A page failing to fetch does not discard successful results from other inputs.

Frequently asked questions

Does this Actor rewrite content?

No. It reports findings and may include a safe replacement hint supplied by a rule.

Is this a grammar checker or spell checker?

It is a writing style and terminology checker, not a general-purpose spelling service. The English presets can identify issues such as passive voice, wordiness, heading style, and sentence length, while custom fields enforce your explicit terminology policy.

How does the brand voice checker work?

It converts explicit brand-language requirements into deterministic checks for required terms, prohibited wording, preferred capitalization, and forbidden phrases. It does not infer personality or semantic tone with AI.

Can I upload arbitrary Vale YAML rules?

No. Customization is limited to declarative terminology and phrase fields.

Does it crawl every page on a domain?

No. Supply each page URL explicitly.

Why do URL line numbers differ from my page source?

URL findings refer to the extracted readable document, because navigation and other page chrome are removed before analysis.

What happens when one URL fails?

The Dataset receives a free failed item with chargedWords: 0, and the Actor continues processing other documents.

What happens when my maximum charge is too low for the next document?

That document is not partially billed. Its findings and word count are withheld, and the Dataset receives a free skipped item explaining that the charge limit was reached.

Responsible use

Only submit content and URLs you are authorized to process. Avoid sending secrets, credentials, personal data, unpublished confidential material, or content that should not be stored in Actor run storage. Respect website terms and applicable laws when analyzing public pages.

Support

If a run behaves unexpectedly, open an issue from the Actor page and include the run ID, the affected input type, and the relevant Dataset item. Do not include credentials or confidential text in the support message.