# Getting started

Everything you need to embed a multilingual proofreading tool with spell check and grammar support into your web system using WProofreader SDK.

<table data-card-size="large" data-column-title-hidden data-view="cards"><thead><tr><th></th><th></th><th data-type="content-ref"></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><h4>Integrations</h4></td><td>Learn how to initialize WProofreader in various HTML editable fields, CKEditor, TinyMCE, Froala, and other editors.</td><td><a href="/pages/bWPnpT5GAw6nFUpsZDcx">/pages/bWPnpT5GAw6nFUpsZDcx</a></td><td><a href="/pages/bWPnpT5GAw6nFUpsZDcx">/pages/bWPnpT5GAw6nFUpsZDcx</a></td></tr><tr><td><h4>Features</h4></td><td>Explore spell check, grammar checking, style guide, autocorrect, autocomplete, and AI writing assistant</td><td><a href="/pages/X99IJHzrziiZ2YfyoZyX">/pages/X99IJHzrziiZ2YfyoZyX</a></td><td><a href="/pages/X99IJHzrziiZ2YfyoZyX">/pages/X99IJHzrziiZ2YfyoZyX</a></td></tr><tr><td><h4>Deployment</h4></td><td>Install and configure the self-hosted WProofreader SDK. Covers system requirements, licensing, and platform-specific installation guides.</td><td><a href="/pages/zmeXuoVKmlnEZ7YEObHc">/pages/zmeXuoVKmlnEZ7YEObHc</a></td><td><a href="/pages/zmeXuoVKmlnEZ7YEObHc">/pages/zmeXuoVKmlnEZ7YEObHc</a></td></tr><tr><td><h4>API reference</h4></td><td>Work with the spelling, grammar, autocorrect, autocomplete, and custom dictionary APIs directly.</td><td><a href="/pages/ZUGMymVmHyrOtpLfWfdS">/pages/ZUGMymVmHyrOtpLfWfdS</a></td><td><a href="/pages/ZUGMymVmHyrOtpLfWfdS">/pages/ZUGMymVmHyrOtpLfWfdS</a></td></tr><tr><td><h4>Admin panel</h4></td><td>Manage your subscription, credentials, team, organization dictionaries, style guide, and analytics.</td><td><a href="/pages/9lyu6uLcYSJsBJlfFqt3">/pages/9lyu6uLcYSJsBJlfFqt3</a></td><td><a href="/pages/9lyu6uLcYSJsBJlfFqt3">/pages/9lyu6uLcYSJsBJlfFqt3</a></td></tr><tr><td><h4>Plans and billing</h4></td><td>Compare cloud and self-hosted options, understand service usage limits, and choose the right plan.</td><td><a href="/pages/n9xL0RwRHQ3BoTURl5Yy">/pages/n9xL0RwRHQ3BoTURl5Yy</a></td><td><a href="/pages/n9xL0RwRHQ3BoTURl5Yy">/pages/n9xL0RwRHQ3BoTURl5Yy</a></td></tr></tbody></table>


# Overview

WProofreader by [WebSpellChecker](https://webspellchecker.com/) delivers enterprise-grade grammar and spelling correction for web applications in [20+ languages](/v6.10.0.0/features/supported-languages). Built for tech experts who need reliable, multilingual proofreading that integrates seamlessly into their workflow.

WProofreader empowers you as an engineer to:

* **Enhance user experience** with real-time grammar and spelling corrections across 20+ languages, including English, German, Spanish, French, and more.
* **Reduce friction** in writing workflows with intelligent spelling autocorrection.
* **Streamline writing in multilingual environments** through automatic language detection. This will enhance your company end-users' writing skills effortlessly with automatic language detection and spelling autocorrection.
* Provide capabilities for end-users to **speed up writing flow** by enabling spelling autocomplete suggestions.
* **Maintain consistency** with [organization-wide custom dictionaries](/v6.10.0.0/features/custom-dictionary) for industry terminology, acronyms, and proper names.
* **Meet industry standards** using specialized dictionaries for legal and medical domains.
* Build corporate style guides to **keep the internal and external business communication consistent.**
* **Customize the experience** through configuration reference with the [customization options](https://webspellchecker.com/docs/api/wscbundle/Options.html) for UI and behavior of WProofreader tailored to your organization's needs.

Get up and running quickly with our step-by-step integration guides, [API reference](/v6.10.0.0/api-reference/overview), and code samples. For advanced customization or technical support, our [support team](https://webspellchecker.com/contact-us/) is ready to help you build the perfect solution.


# What's new in 6.10.0?

February 20, 2026

**Key updates:**

* New trigram-based spelling suggestion prioritization for English, German, and Spanish — the correct suggestion now ranks first \~80% of the time, up from \~71% with the previous approach
* Expanded dictionaries with 2,000+ new entries and 600+ medical terms across multiple languages
* Autocomplete suggestions now show a keyboard hint (Tab / →) for accepting completions
* 80+ new English style rules addressing profanity, slurs, and inclusive language
* Improved AI proofreading reliability by disabling 15 problematic rules across English, German, and Spanish
* Updated grammar engine (LanguageTool 2026-02-13) with major Portuguese improvements and updates across Catalan, Spanish, English, German, and Ukrainian
* Added Greek and Czech language resources; updated Czech Hunspell dictionary
* AI writing assistant disclaimer localized for Danish and Norwegian
* Updated third-party libraries: TensorFlow 2.18, rust\_swig 0.10.0, tokenizers 0.22.2
* Security fix. Updated lucene-core to address [PRISMA-2021-0081](https://issues.apache.org/jira/browse/LUCENE-9981)

For the full list of changes, see the [release notes](https://webspellchecker.com/release-notes/wproofreader-core-6-10-0/).


# Supported browsers

All browsers listed in the table below support web pages working in a **standard mode**.

|                                | Supported browsers               | Supported versions                                                                                                                                                                                         |
| ------------------------------ | -------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Web browsers**               | Chrome                           | The latest stable version                                                                                                                                                                                  |
|                                | Microsoft Internet Explorer (IE) | <p>11.0 – limited support</p><p>Support of IE 9.0 and 10.0 is available for the SCAYT plugin for CKEditor 4 only.</p><p>The compatibility view or quirks mode in IE is <strong>not supported</strong>.</p> |
|                                | Microsoft Edge                   | The latest stable version                                                                                                                                                                                  |
|                                | Mozilla Firefox                  | The latest stable version                                                                                                                                                                                  |
|                                | Safari                           | The latest stable version on Mac OS X only                                                                                                                                                                 |
| **Mobile and tablet browsers** | Chrome for Android               | The latest stable version                                                                                                                                                                                  |
|                                | iOS Safari                       | The latest stable version                                                                                                                                                                                  |

<br>


# Supported integrations

WProofreader SDK can be integrated into a variety of environments. Below is a list of the most common use cases.

{% hint style="success" %}
See [demos](https://demos.webspellchecker.com/) of WProofreader integrated into different rich text editors.
{% endhint %}

#### Rich text editors

* [CKEditor 4](https://ckeditor.com/ckeditor-4/)
* [CKEditor 5](https://ckeditor.com/ckeditor-5/)
* [TinyMCE](https://www.tiny.cloud/)
* [Froala Editor](https://www.froala.com/wysiwyg-editor)
* [Kendo UI](https://www.telerik.com/kendo-ui)
* [Quill](https://quilljs.com/)
* [Redactor](https://imperavi.com/redactor/)
* [Summernote](https://summernote.org/)
* [RadEditor -Telerik ASP.NET Editor](https://demos.telerik.com/aspnet-ajax/editor/examples/overview/defaultcs.aspx)
* [ProseMirror](https://prosemirror.net/)
* [Trix](https://github.com/basecamp/trix)
* [Slate.js](https://www.slatejs.org/examples/richtext) \*
* [Draft.js](https://draftjs.org/)\*\*
* [Tiptap](https://tiptap.dev/)

**Code editos**

* [CodeMirror 6](https://codemirror.net/)

{% hint style="warning" %}
\* Integration with **Slate.js** might not work properly in IE11.\
\*\* Integration with **Draft.js** might not work properly in IE11. Due to critical issues, the autocorrect functionality is disabled in this editor.
{% endhint %}

#### HTML elements

* HTML editable controls: `<textarea>` , `<input>` disabled by default,
* HTML elements with `contenteditable="true"`, for example: `<div>, <iframe>`

### Content management systems (CMS)

* **WordPress** — available as a plugin in the [WordPress plugin directory](https://wordpress.org/plugins/webspellchecker/).
* **Drupal** — available as part of the following Drupal modules:
  * [CKEditor 5 Plugin Pack](https://www.drupal.org/project/ckeditor5_plugin_pack?utm_source=chatgpt.com) – includes a free version of WProofreader with daily usage limits.
  * [CKEditor 5 Premium Features](https://www.drupal.org/project/ckeditor5_premium_features?utm_source=chatgpt.com) – connects to the paid version of WProofreader.

For details on how to integrate WProofreader, refer to the [Integrations](/v6.10.0.0/integrations/supported-browsers) section.


# Initialization


# Initialization options

WProofreader can be initialized in several ways depending on your integration scenario. This page explains the supported methods and shows how to apply them in practice.

The `WEBSPELLCHECKER_CONFIG` (referred to as *CONFIG*) can be defined in a script or loaded from a file as described in the SDK overview.

{% hint style="info" %}
Once initialized, you can further adjust behavior and UI using the [configuration reference](https://webspellchecker.com/docs/api/wscbundle/Options.html).
{% endhint %}

👉 See [demos](https://demos.webspellchecker.com/) for working examples with different editors and HTML elements.

***

### Initialize using `autoSearch`

The `autoSearch` feature detects new editable fields on the page and enables proofreading when the field is focused.

* Useful for pages with multiple controls.
* Improves performance by checking only the active field.
* Frees memory when fields are removed or hidden, preventing leaks.
* Proofreading starts only when a field receives focus.

#### Example: using CONFIG

{% code overflow="wrap" fullWidth="true" %}

```html
<script>
  window.WEBSPELLCHECKER_CONFIG = {
    autoSearch: true,
    lang: 'en_US',
    ...
  };
</script>
```

{% endcode %}

{% code overflow="wrap" fullWidth="true" %}

```html
<!-- Cloud version -->
<script src="https://svc.webspellchecker.net/spellcheck31/wscbundle/wscbundle.js"></script>
<!-- Self-hosted version -->
<!-- <script src="http(s)://your_host_name/wscservice/wscbundle/wscbundle.js"></script> -->
```

{% endcode %}

#### Example: using inline data attributes

{% code overflow="wrap" fullWidth="true" %}

```html
<script
  data-wsc-autosearch="true"
  data-wsc-lang="en_US"
  ...
  src="https://svc.webspellchecker.net/spellcheck31/wscbundle/wscbundle.js">
</script>

<!-- Self-hosted alternative:
<script
  data-wsc-autosearch="true"
  data-wsc-lang="en_US"
  ...
  src="http(s)://your_host_name/wscservice/wscbundle/wscbundle.js">
</script>
-->
```

{% endcode %}

{% hint style="warning" %}
Inline data attributes don’t support some options (for example, `actionItems`, `suggestionsCount`, `moreSuggestionsCount`). Use CONFIG for full configuration.
{% endhint %}

***

### Initialize using `init()` method

Use `init()` when you want explicit control over where WProofreader is enabled.

* Suitable for static pages where controls are known in advance.
* Instances are created on page load.
* With dynamic content, you must manage when to create or destroy instances.
* Proofreading is enabled immediately. It doesn’t require focus or selection, unlike with `autoSearch`.

#### Example: single HTML element

{% code overflow="wrap" fullWidth="true" %}

```html
<div contenteditable id="container1">
  <p>This sample text demonstrates WProofreader in a contenteditable div element.</p>
</div>

<script>
  var instance1 = WEBSPELLCHECKER.init({
    container: document.getElementById('container1'),
    lang: 'en_US',
    ...
  });
</script>
```

{% endcode %}

{% code overflow="wrap" fullWidth="true" %}

```html
<!-- Cloud version -->
<script src="https://svc.webspellchecker.net/spellcheck31/wscbundle/wscbundle.js"></script>
<!-- Self-hosted version -->
<!-- <script src="http(s)://your_host_name/wscservice/wscbundle/wscbundle.js"></script> -->
```

{% endcode %}

#### Example: multiple elements

For multiple fields (such as a `div` and a `textarea`), define CONFIG once and call `init()` for each target element.

👉 See the [demo for HTML controls](https://demos.webspellchecker.com/wproofreader-html-controls.html).

#### Example: rich text editors

For editors such as CKEditor 4, Froala, or Quill, initialization usually combines `autoSearch`, `autoDestroy`, and `init()`:

* `init()` ensures WProofreader is explicitly attached to the editor’s editable container.
* `autoSearch` restores the instance dynamically (for example, when switching between editing modes).
* `autoDestroy` removes the instance when the editable container is deleted or hidden, preventing memory leaks.

{% hint style="success" %}
This combination is useful when switching between editing modes (for example, toggling between WYSIWYG and code view). In such cases, WProofreader must be destroyed in one mode and restored automatically when the user switches back.
{% endhint %}

👉 See the demo with [CKEditor 4](https://demos.webspellchecker.com/wproofreader-ckeditor4.html), [Froala](https://demos.webspellchecker.com/wproofreader-froala.html), or [Quill](https://demos.webspellchecker.com/wproofreader-quill.html).

***

### Initialize using `data-wsc-autocreate`

Mark elements with `data-wsc-autocreate="true"` to create instances automatically. Element-level attributes can override global CONFIG settings.

#### Example: HTML elements

{% code overflow="wrap" fullWidth="true" %}

```html
<script>
  window.WEBSPELLCHECKER_CONFIG = {
    lang: 'en_US'
  };
</script>

<div contenteditable data-wsc-autocreate="true">
  <p>This sample text demonstrates WProofreader in a div.</p>
</div>

<textarea data-wsc-autocreate="true" data-wsc-lang="es_ES">
  This sample text demonstrates WProofreader in a textarea.
</textarea>
```

{% endcode %}

{% code overflow="wrap" fullWidth="true" %}

```html
<!-- Cloud version -->
<script src="https://svc.webspellchecker.net/spellcheck31/wscbundle/wscbundle.js"></script>
<!-- Self-hosted version -->
<!-- <script src="http(s)://your_host_name/wscservice/wscbundle/wscbundle.js"></script> -->
```

{% endcode %}

{% hint style="info" %}
In this example, the `textarea` uses Spanish (`es_ES`) because element attributes override the global `lang` setting.
{% endhint %}

***

### Related resources

* [Configuration reference](https://webspellchecker.com/docs/api/wscbundle/Options.html) — full list of available options.
* [JavaScript SDK on npm](https://www.npmjs.com/package/@webspellchecker/wproofreader-sdk-js) and [GitHub repository](https://github.com/WebSpellChecker/wproofreader-sdk-js/tree/master) — includes framework examples with CKEditor 4, TinyMCE, Froala, and Quill in Vue, React, and Angular.
* [Demos](https://demos.webspellchecker.com/)


# Initialize using npm SDK

The [WProofreader SDK npm package](https://www.npmjs.com/package/@webspellchecker/wproofreader-sdk-js) is designed for JavaScript framework projects (React, Angular, Vue) or setups where you use multiple editors and want a single proofreading dependency. It works with any supported editor and HTML editable element.

[See framework examples with CKEditor 4, TinyMCE, Froala, and Quill →](https://github.com/WebSpellChecker/wproofreader-sdk-js/tree/master/examples)

#### Install the package

```bash
npm install @webspellchecker/wproofreader-sdk-js
```

#### Import and configure

Import the SDK in the file that initializes your application. Call `configure()` once to set global options. This must happen before any `init()` calls.

**Cloud:**

```js
import WProofreaderSDK from '@webspellchecker/wproofreader-sdk-js';

WProofreaderSDK.configure({
  autoSearch: true,
  lang: 'en_US',
  serviceId: 'your-service-ID'
});
```

**Self-hosted:**

```js
import WProofreaderSDK from '@webspellchecker/wproofreader-sdk-js';

WProofreaderSDK.configure({
  autoSearch: true,
  lang: 'en_US',
  serviceProtocol: 'https',
  serviceHost: 'your_host_name',
  servicePort: '443',
  servicePath: 'wscservice/api',
  srcUrl: 'https://your_host_name/wscservice/wscbundle/wscbundle.js'
});
```

With `autoSearch` enabled, WProofreader will activate automatically when any editable element receives focus. You don't need to do anything else.

#### Force initialization on a specific element

If you don't want to wait for `autoSearch` and need proofreading to start immediately, call `init()` on a specific container:

```js
WProofreaderSDK.init({
  container: document.getElementById('your-editable-element')
});
```

#### TypeScript support

Starting from version 1.1.0, the package includes type definitions (`.d.ts`) for core methods, initialization, configuration, and instance management. Refer to the [Angular example →](https://github.com/WebSpellChecker/wproofreader-sdk-js/tree/master/examples) for a TypeScript integration sample.

#### Related resources

* [npm package →](https://www.npmjs.com/package/@webspellchecker/wproofreader-sdk-js)
* [GitHub repository →](https://github.com/WebSpellChecker/wproofreader-sdk-js) with framework examples for React, Angular, and Vue
* [Configuration reference →](https://webspellchecker.com/docs/api/wscbundle/Options.html) for the full list of available options


# Customization options OLD

Before customizing the WProofreader settings described in this section:

* Initialize it using one of the approaches in the [Initialization Options](broken://pages/4bCAKQPotxz7H6cfE7uo) section.
* Acknowledge yourself with the full list of customization options available in [Configuration reference](https://webspellchecker.com/docs/api/wscbundle/Options.html).

Being an administrator, you can customize WProofreader default settings such as user interface and behavior described in this guide.

### 1. Introduction <a href="#wproofreadercustomizationoptions-1.introduction" id="wproofreadercustomizationoptions-1.introduction"></a>

#### 1.1. On-premise and cloud version <a href="#wproofreadercustomizationoptions-1.1.on-premiseandcloudversion" id="wproofreadercustomizationoptions-1.1.on-premiseandcloudversion"></a>

In general, WProofreader provides the same functionality for both cloud and on-premise versions. The difference is mainly about the location of requests processing: it can be either on WebSpellChecker cloud hosted on [Amazon Web Services](https://aws.amazon.com/) (AWS) in data centers in the USA or on your servers such as physical servers, VMs, or instances.

With the cloud version, to access the services, you need to use a special activation key in the **serviceId** parameter. The path to the WebSpellChecker cloud will be obtained from the path to the **wscbundle.js** file.

For the on-premise version, you need to instruct WProofreader where the requests will be processed by specifying the following parameters:

* serviceProtocol
* serviceHost
* servicePath
* servicePort

Example of setting up the on-premise version of WProofreader with the **autoSearch** option turned on:

```javascript
<script>
    window.WEBSPELLCHECKER_CONFIG = {
        autoSearch:true,
        serviceProtocol:'https', 
        serviceHost:'your_host_name',
        servicePort:'your_port_number',
        servicePath:'virtual_directory/api' //by default the virtual directory name is wscservice
  };
</script>
<script type="text/javascript" src="https://host_name/wscservice/wscbundle/wscbundle.js"></script>
```

For more details, refer to Initialization options.

Example for setting up the **Cloud** version of WProofreader with the autoSearch option turned on:

```javascript
<script>
    window.WEBSPELLCHECKER_CONFIG = {
    autoSearch: true,
    serviceId:'your-service-ID'
   };
</script>
<script type="text/javascript" src="https://svc.webspellchecker.net/spellcheck31/wscbundle/wscbundle.js"></script>
```

For more details, refer to [WProofreader SDK](https://docs.webspellchecker.com/display/WSDK/WProofreader+SDK).

#### 1.2. AutoSearch options <a href="#wproofreadercustomizationoptions-1.2.autosearchoptions" id="wproofreadercustomizationoptions-1.2.autosearchoptions"></a>

Once you have enabled autoSearch by adding **autoSearch: true**, in configuration, you can specify where the spelling and grammar check should be enabled on your webpage.

By default, WProofreader with autoSearch function turned on will be enabled only in the area in focus. For the areas which are not focused, WProofreader will not be enabled by default until the user places a cursor there and starts typing. For details, refer to the following [AutoSearch mechanism](https://webspellchecker.com/docs/api/wscbundle/AutoSearchMechanism.html):

* **disableAutoSearchIn** lets you disable the autoSearch mechanism by **class, id, data attribute name, and HTML elements**. Please note that if the **enableAutoserchIn** option is specified, this option will be ignored.
* **enableAutoSearchIn** lets you enable the autoSearch mechanism only for elements with provided **class, id, data attribute name, or HTML element type**.

Only one option can be used at the same time. The **enableAutoSearch** option has higher priority compared with **disableAutoSearchIn**. If you try using both of them, it can lead to unpredictable behavior and conflicts.

```javascript
<script>
    window.WEBSPELLCHECKER_CONFIG = {
        autoSearch: true,
        disableAutoSearchIn: ['.class','#id','[data-attribute]','textarea'],
        enableAutoSearchIn: ['.class','#id','[data-attribute]','textarea'],
        ...
    }
</script>
```

**1.2.1 Enable proofreading in inputs**

By default, WProofreader is disabled in HTML **\<input>** editable elements due to possible compatibility issues. However, you can change this behavior by using the **enableAutoSearchIn** option:

```javascript
enableAutoSearchIn:['input'],
```

#### 1.3. AutoStartup <a href="#wproofreadercustomizationoptions-1.3.autostartup" id="wproofreadercustomizationoptions-1.3.autostartup"></a>

The **autoStartup** parameter is set to **true** by default, meaning that WProofreader starts in the enabled state and starts processing available text for grammar, spelling, and style errors. If for some reason, you do not want WProofreader to start checking text at once and allow your users to choose when to start, you have an option to start WProofreader in the disabled state. To do so, set the **autoStartup** value as **false,** as shown below:

```javascript
autoStartup: false,
```

When WProofreader starts in a disabled state, the badge is grayed out. To activate it, users need to go to the badge and click the turn on the icon.

#### 1.4. Deactivating grammar checking <a href="#wproofreadercustomizationoptions-1.4.deactivatinggrammarchecking" id="wproofreadercustomizationoptions-1.4.deactivatinggrammarchecking"></a>

Grammar checking is enabled by default in WProofreader. If you want to deactivate grammar checking, specify the **enableGrammar** parameter and set it to false as shown below:

```javascript
enableGrammar: false,
```

After you have deactivated grammar checking, it becomes disabled for all languages. Only spell check will be performed then. Note, that AI-based languages will stop working at all in case of turning off the grammar.

### 2. Customizing user interface <a href="#wproofreadercustomizationoptions-2.customizinguserinterface" id="wproofreadercustomizationoptions-2.customizinguserinterface"></a>

With WProofreader customization options you can do the following:

* Change the default style theme;
* Suggestions balloon view and commands available;
* Badge view and commands available;
* Settings dialog view and additional preferences;
* Actions for Proofread in dialog mode.

#### 2.1. Change the default style theme <a href="#wproofreadercustomizationoptions-2.1.changethedefaultstyletheme" id="wproofreadercustomizationoptions-2.1.changethedefaultstyletheme"></a>

You have an option to change the default style theme using the **theme** option. At the moment, the following themes are available: **default**, **gray**, **dark**, **custom**. The **gray** theme perfectly matches the color palette of modern rich text editors.

Besides, you can adjust CSS styles to make them look native inside your web app. To do this, simply use the **custom** theme option and write your CSS styles. Find out more in our how-to guide: [How to customize the look and feel of WProofreader?](/v6.10.0.0/integrations/how-tos/how-to-customize-the-look-and-feel-of-wproofreader)

```javascript
theme: 'gray',
```

#### 2.2. Suggestions pop-up view and commands <a href="#wproofreadercustomizationoptions-2.2.suggestionspop-upviewandcommands" id="wproofreadercustomizationoptions-2.2.suggestionspop-upviewandcommands"></a>

You can customize the WProofreader options available in the suggestions pop-up. For example:

* Limit the number of suggestions shown to users;
* Prevent users from adding words to the user custom dictionary;
* Add more commands to the list of action items, for example, the possibility to switch to the **Settings** dialog.

The latter is possible only in the case of a disabled badge. All the action items from the badge are moved to the suggestions pop-up then. For details, see [Removing actions from badge](#wproofreadercustomizationoptions-2.3.wproofreaderbadge) section.

**2.2.1. Changing the number of spelling suggestions**

By default, WProofreader offers 3 suggestions in its suggestions pop-up. An admin can customize this number using an API option and provide both a bigger and smaller number of suggestions.

For the cloud version, up to 8 suggestions are available. For the on-premise version, this number can be increased. You can use the **suggestionsCount** parameter to increase or decrease the number of spelling suggestions shown to your end-users.

Displaying a significant number of suggestions may decrease the speed of the service.

To display only 2 suggestions:

```javascript
suggestionsCount:2,
```

**2.2.2. Changing action items order and availability**

Use the **actionItems** parameter to add or hide the menu items in the suggestion pop-up and modify the order of these items. To do so, change the '**addWord**', '**ignoreAll**', '**ignore**', '**settings**', '**toggle**', '**proofreadDialog**' array values accordingly.

For example, if you want to prevent your users from adding words to their user dictionary, remove the '**addWord**' value from the array of parameter values:

```javascript
actionItems:['ignoreAll','ignore','settings','toggle','proofreadDialog'],
```

Removing the **addWord** from the array of parameter values removes the **Add word** command for both suggestion balloons and for proofreading in dialog mode.

To hide **Settings** dialog for your users, remove the '**settings**' from the array of parameter values:

```javascript
actionItems:['addWord','ignoreAll','toggle','proofreadDialog'],
```

**2.2.3. Enabling or disabling the more suggestions sub-menu item**

By default, the **moreSuggestionsCount** parameter is set to 0, meaning that additional suggestions, if there are any more than specified in the **suggestionsCount** parameter are not shown. To display 3 suggestions on the suggestions balloon view and show 5 more suggestions in the **More Suggestions** section:

```javascript
suggestionsCount:3,
moreSuggestionsCount:5,
```

Due to some specifics of the spelling engine and performance reason, for the cloud version, the maximum number of suggestions in total for American and British English is three. The bigger values will be ignored.

#### 2.3. WProofreader badge <a href="#wproofreadercustomizationoptions-2.3.wproofreaderbadge" id="wproofreadercustomizationoptions-2.3.wproofreaderbadge"></a>

The badge in the lower-right part of the editable area shows the status of the checking process (namely, the number of errors, the process itself – spinner, all checked) and allows to access more options:

* Turn on/off the proofreading;
* Switch to the ‘Proofread in dialog’ mode;
* Switch to the Settings dialog to manage to spell checking options, language, and user custom dictionary;
* Promptly select a language for check.

**2.3.1. Badge view and options**

You can change the following badge options:

* Turn off badge pulsation,
* Completely remove a badge,
* Remove some actions from the badge, for example,

**Settings** ![](/files/6ns8AS5ZrsC9OTf3KmhV), **Disable/enable WProofreader** ![](/files/HtQ1f8hC26qxEnZyYpmq), or **Proofread in dialog** ![](/files/aEiBKWAJ6FRU01ga2MDB).

**2.3.2. Turning off badge pulsation**

When WProofreader starts, the badge starts pulsing three times to get the user’s attention to the discovered issues. If it turns out to be distracting for the users, you can disable pulsation by setting the **disableBadgePulsation** parameter as **true** as shown in the sample below:

```javascript
disableBadgePulsing:true,
```

**2.3.3. Removing a badge**

If the **enableBadgeButton** parameter is set **false,** part of action items, specifically **Settings**, **Disable/Enable** and **Proofread in dialog** from the badge area will be moved to the suggestions pop-up:

```javascript
enableBadgeButton:false,
```

Users will not have an indication of the total number of errors detected in the control. The spinner that shows the grammar and spelling checking process is also disabled.

**2.3.4. Removing actions from badge**

To remove some actions from the badge, for example, **Settings**![](/files/6ns8AS5ZrsC9OTf3KmhV), **Disable/enable WProofreader** ![](/files/HtQ1f8hC26qxEnZyYpmq), or **Proofread in dialog** ![](/files/aEiBKWAJ6FRU01ga2MDB), use the **actionItems** parameter. An example below shows how you can allow the users to access proofreading in dialog only from the badge:

```javascript
actionItems:['proofreadDialog'],
```

**2.3.5. Enabling language selector in badge**

There is an option available that allows adding **a language selector** that will be present on the badge. This helps a user switch quickly among languages without going to the settings.

```javascript
enableLanguagesInBadgeButton:true,
```

#### 2.4. Settings dialog <a href="#wproofreadercustomizationoptions-2.4.settingsdialog" id="wproofreadercustomizationoptions-2.4.settingsdialog"></a>

The **Settings** dialog contains the following sections: **General**, **Options, Languages, Dictionaries,** and **About.**

| Name           | Actions available                                                                                                                                    | Description                                                                                                                                                                                                                                                                                                                                                                  |
| -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| General        | Hide the section from your users so that they use only predefined options and choose whether the extra options will be available for your end-users. | Enabling/disabling [Spelling autocorrect](/v6.10.0.0/features/spelling-autocorrect) and [Autocomplete suggestions](/v6.10.0.0/features/text-autocomplete) functionality as well as [Style guide](/v6.10.0.0/features/old-style-guide-builder), Spelling and Grammar suggestions                                                                                              |
| Ignore options | Predefine some or all available options for application users.                                                                                       | <p>Specifying the most common cases to ignore spelling checks:</p><ul><li>words with all letters capitalized (for example, “SCAYT”),</li><li>domain names (for example, “support@<a href="http://webspellchecker.net/">webspellchecker.net</a>”),</li><li>words with mixed case (for example, “WebSpellChecker”),</li><li>words with numbers (for example, “2nd”).</li></ul> |
| Languages      | Hide the section from your users so that they use only predefined options and set a predefined language for all of them.                             | Selecting the default language for grammar and spelling checking.                                                                                                                                                                                                                                                                                                            |
| Dictionaries   | Hide the section from your users so that they use only predefined options and set up a predefined user dictionary for all of them.                   | Adding and deleting words to/from personal user dictionaries. Connecting and disconnecting selected dictionaries.                                                                                                                                                                                                                                                            |
| About          | Hide the branding information if you have a fully-fledged version of WebSpellChecker.                                                                | Displaying information on WProofreader copyright info and version number.                                                                                                                                                                                                                                                                                                    |

Depending on your web app usage preferences or requirements, you may want to customize the **Settings** dialog, for example:

* Hide one of the sections;
* Change the order of the mostly used tabs first;
* Disable commands for users so that they have the admin-defined settings and presets only.

With the **settingsSections** parameter, you can change the **Settings** dialog sections visibility and hide the necessary sections. Example below hides the 'general' tab.

```javascript
settingsSections:['languages','dictionaries','options', 'about'],
```

To hide the 'About' tab is possible with the on-premise version 5.4.0 and advanced cloud pricing plan when this option is enabled for your subscription and using in combination with the **removeBranding** parameter.

**2.4.1. Ignore options**

Settings on the **Options** section let you define the following spelling exceptions:

* All caps words like 'EXAMPL'.
* Domain names like '[http://example.com](http://example.com/)'.
* Words with mixed case like 'eXaMpL'.
* Words with numbers like 'exampl7'.

You can change the default behavior using the following parameters:

```javascript
ignoreAllCapsWords:true,
ignoreDomainNames:true,
ignoreWordsWithMixedCases:true,
ignoreWordsWithNumbers:true,
```

To disable ignoring, set the value of the desired option as **false.**

As for now, ignoreAllCapsWords doesn't work for AI-based languages.

**2.4.2. Language**

The **Language** section of the **Settings** dialog contains the list of available languages for spelling and grammar checking and enables users to set the default checking language.

To set the predefined language for all application users, use the **lang** parameter and specify the desired language shortcode as shown in the [Supported languages](/v6.10.0.0/features/supported-languages).

To hide the **Language** section from your users so that they cannot modify the selected language, use the **settingsSections** parameter as shown below:

```javascript
settingsSections:['dictionaries','options','general','about'],
```

**2.4.3. Dictionaries**

**Customizing Dictionaries user interface**

These are some options for altering **Dictionaries** user interface elements and features:

1. Hiding **Dictionary** view at all.
2. Hiding or removing the Preferences section on the **Dictionary** view to prevent users from adding/changing/removing the dictionary.
3. Setting up a predefined dictionary for all users.

**Hiding preferences section on the Dictionary tab**

The **Preferences** section of the **Dictionaries** tab contains action items and buttons for managing user dictionaries, specifically: create a new dictionary, connect/disconnect an existing dictionary, rename and delete a dictionary.

You may need to hide or remove the **Preferences** section when users have a general user dictionary and you do not want your users to make any changes to it except adding or removing words.

To disable the dictionary preferences UI for your users, specify the **disableDictionariesPreferences** option as **true**:

```javascript
disableDictionariesPreferences:true,
```

**Removing Dictionaries tab**

You may want to remove the **Dictionaries** tab from user interface in the following cases:

* Users can only add new words using the **Add word** command from the suggestion balloon or when proofreading in a dialog mode. The dictionary itself cannot be deleted or modified.
* There is no predefined dictionary and you want to prevent storing the dictionaries on a server. Instead, all the words are saved in users' browsers local storage.

Instead of completely removing the **Dictionaries** tab, consider disabling only the user interface elements responsible for creating, deleting, renaming, and connecting a dictionary as in the examples above and when allowing your users to see and manage words added to the dictionary.

If the users have not saved the words added to the dictionary on the server and use local storage instead, these words become inaccessible when switching to a different browser or a computer. If there is no **Dictionary** tab in the **Settings** dialog, they cannot remove some words they might have added by mistake. For details refer to [User custom dictionary](broken://pages/wUtvaCTReVmwdJNgIrJ9).

Use the sample below:

```javascript
settingsSections:['languages','options','general'],
```

**2.4.4. About tab**

You can remove the **About** tab of WProofreader dialog and branding information if you have purchased a **Custom** or an on-premise version of the WProofreader package.

To remove the branding of WProofreader, namely the title on the UI of the product and **About** tab with copyrights and logo, set the removeBranding parameter value true as shown in the code sample below:

```javascript
removeBranding:true,
```

#### 2.5. Actions for proofreading in a dialog <a href="#wproofreadercustomizationoptions-2.5.actionsforproofreadinginadialog" id="wproofreadercustomizationoptions-2.5.actionsforproofreadinginadialog"></a>

Actions available for configuring WProofreader dialog mode are the same as for the suggestions popup, namely:

* Hiding or turning off descriptions of discovered grammar problems;
* Changing the number of suggestions;
* Hiding some actions, for example, **Add to dictionary** or **Ignore All**;
* Preventing users from switching to the **Settings** dialog mode.

You can turn off descriptions for discovered grammar issues both in the suggestions balloon and WProofreader dialog. To do so, set the value disableProblemDescription as **true.**

```javascript
disableProblemDescription:true,
```

To hide the **Add to dictionary** command, specify the actionItems parameter values as shown in the sample below:

```javascript
actionItems:['ignoreAll','settings','toggle','proofreadDialog'],
```

To hide or remove the **Settings** icon so that the users cannot navigate and change WProofreader settings, exclude the settings value from the array of parameter values:

```javascript
actionItems:['ignoreAll','toggle','proofreadDialog'],
```

### 3. Languages and dictionaries settings <a href="#wproofreadercustomizationoptions-3.languagesanddictionariessettings" id="wproofreadercustomizationoptions-3.languagesanddictionariessettings"></a>

#### 3.1. Default language options <a href="#wproofreadercustomizationoptions-3.1.defaultlanguageoptions" id="wproofreadercustomizationoptions-3.1.defaultlanguageoptions"></a>

The default language setting for WProofreader users is **auto detect language (auto)**. This is a feature that auto-detects the input language and does the check using the proper language. Its support covers around 80 languages.

{% hint style="warning" %}
At least three correctly spelled words are required for the language autodetector. If a language isn't detected, the text won't be checked.
{% endhint %}

But being the administrator, you can change this default language to one of the [Supported languages](/v6.10.0.0/features/supported-languages) for all users.

#### 3.2. Default language for all users <a href="#wproofreadercustomizationoptions-3.2.defaultlanguageforallusers" id="wproofreadercustomizationoptions-3.2.defaultlanguageforallusers"></a>

You can specify the default language for all WProofreader users using the lang option. For example, if you want to specify the German locale for all users, add the following parameter with `de_DE` value in it.

```javascript
lang:'de_DE',
```

To enable the language locale, be sure to use the proper language code. For details, refer to the supported [Supported languages](/v6.10.0.0/features/supported-languages).

{% hint style="warning" %}
Sometimes, you will need to clean the browser's cache and local storage to apply the changes of changing the default language.
{% endhint %}

Users can modify the default language locale using the **Languages** tab of the **Settings** dialog but the locale they have selected will be used until they reload the browser. After reloading the browser, a language specified by the administrator is used again.

#### 3.3. User interface localization language <a href="#wproofreadercustomizationoptions-3.3.userinterfacelocalizationlanguage" id="wproofreadercustomizationoptions-3.3.userinterfacelocalizationlanguage"></a>

You can change WProofreader interface localization to match the locale preferences. The default interface localization language is English. All the available shortcodes for localization are available in the description of localization parameters in [API options.](https://webspellchecker.com/docs/api/wscbundle/Options.html)

For example, to set the German language as the localization option in WProofreader, use the localization parameter as shown below:

```javascript
localization:'de',
```

#### 3.4. Predefined user dictionary <a href="#wproofreadercustomizationoptions-3.4.predefineduserdictionary" id="wproofreadercustomizationoptions-3.4.predefineduserdictionary"></a>

To activate one dictionary common for all users, specify the **userDictionaryName** parameter by providing the dictionary name. After that, all words added by users via the **Add word** command are added to this particular dictionary.

```javascript
userDictionaryName:'user_dictionary_name',
```

If you have authentication enabled in your web app, you can predefine certain dictionaries for specific users using this approach.

Users can add words to a dictionary for spelling suggestions only.

#### 3.5. Extending the list of dictionaries <a href="#wproofreadercustomizationoptions-3.5.extendingthelistofdictionaries" id="wproofreadercustomizationoptions-3.5.extendingthelistofdictionaries"></a>

If you want to use some dictionaries different from the default ones, refer to the list of [additional language dictionaries](/v6.10.0.0/features/supported-languages) available on our website and contact [our sales team](https://webspellchecker.com/contact-us/) for purchasing details.

#### 3.6. Company custom dictionaries <a href="#wproofreadercustomizationoptions-3.6.customdictionaries" id="wproofreadercustomizationoptions-3.6.customdictionaries"></a>

Company custom dictionaries allow creating of company-wide dictionaries and extending the vocabulary of the standard dictionary with words specific to industry or domain. To configure a global custom dictionary in WProofreader, use the **customDictionaryIds** parameter and add a string with required dictionary IDs which should be separated by commas.

```javascript
customDictionaryIds:'100694, 100695',
```

In the example above, ID is the unique dictionary ID that will be assigned to your custom dictionary.

### 4. Miscellaneous options <a href="#wproofreadercustomizationoptions-4.miscellaneousoptions" id="wproofreadercustomizationoptions-4.miscellaneousoptions"></a>

#### 4.1. Minimal word length <a href="#wproofreadercustomizationoptions-4.1.minimalwordlength" id="wproofreadercustomizationoptions-4.1.minimalwordlength"></a>

By default, WProofreader enables spell check starting with 3 or more letters per word. You can customize this option using the **minWordLength** parameter:

```javascript
minWordLength: 2,
```

After you have used this option, the words which have two (2) and more letters in them will be spell checked.

#### 4.2. Excluding elements from checking <a href="#wproofreadercustomizationoptions-4.2.excludingelementsfromchecking" id="wproofreadercustomizationoptions-4.2.excludingelementsfromchecking"></a>

There is a list of options such as **ignoreElements**, **ignoreClasses** and **ignoreAttributes** that help to manage where the text checking should not be done.

Use the **ignoreElements** parameter to instruct WProofreader not to check the HTML elements in the text such as typeface types, links, tables, and others. By default, text within the `<style>` and `<script>` tags are ignored.

You can additionally choose to ignore checking in certain web page markup elements by classes or attributes.

In the example below, text inside table elements, elements containing a specified class or attribute will be skipped during checking:

```javascript
ignoreElements:'table',
ignoreClasses: ['ignore-checking'],
ignoreAttributes: ['data-wsc-ignore-checking']
```

#### 4.3. Disabling proofreading in As You Type mode <a href="#wproofreadercustomizationoptions-4.3.disablingproofreadinginasyoutypemode" id="wproofreadercustomizationoptions-4.3.disablingproofreadinginasyoutypemode"></a>

Proofreading during typing in the so-called ‘as you type mode’ is enabled by default. You can disable this mode using the **proofreadAsYouType** parameter. Thus, text checking becomes possible only in dialog mode. To do so, change the value of **proofreadAsYouType** parameter to **false:**

```javascript
proofreadAsYouType:false,
```

After disabling proofread as you type mode, users can access proofreading by initiating WProofreader dialog mode from the badge by clicking **Proofread in dialog** icon.

#### **4.4. Autocomplete suggestions** <a href="#wproofreadercustomizationoptions-4.4.autocompletesuggestions" id="wproofreadercustomizationoptions-4.4.autocompletesuggestions"></a>

The feature automatically completes the user’s thought by suggesting the next word or a short phrase based on the context. As for now, it is available for English and its dialects.

The **autocomplete** parameter is set to **false** by default, meaning that autocomplete suggestions functionality starts in the disabled state. Admins can enable autocomplete by adding **autocomplete: true**, option to WEBSPELLCHECKER\_CONFIG. End users will still have an option to disable autocomplete suggestions from the UI of the Settings dialog.

```javascript
autocomplete:true,
```

Read more about the [Autocomplete suggestions](https://docs.webspellchecker.com/display/WSDK/Autocomplete+suggestions) in our article.

#### **4.5. Autocorrect** <a href="#wproofreadercustomizationoptions-4.5.autocorrect" id="wproofreadercustomizationoptions-4.5.autocorrect"></a>

Autocorrect automatically makes or suggests corrections for common spelling mistakes while users are typing. Autocorrect is enabled by default using the new WProofreader customization option **autocorrect**.

Admins can disable autocorrect by default by adding the **autocorrect** option set to **false** to WEBSPELLCHECKER\_CONFIG. In this case, end-users still will have an option to enable autocorrect from the UI of the Settings dialog.

```javascript
autocorrect:false,
```

Read more about [Autocorrect](https://docs.webspellchecker.com/display/WSDK/Spelling+autocorrect) in our article.

\ <br>


# Configuration options

WProofreader behavior and UI are controlled through configuration options set in `WEBSPELLCHECKER_CONFIG` or passed directly to `init()`. This section covers the most commonly used options grouped by task.

For the complete list of all available parameters, types, and default values, refer to the [Configuration reference](https://webspellchecker.com/docs/api/wscbundle/Options.html).

* **Service connection.** Cloud or self-hosted endpoint and request authentication.
* **Startup and behavior.** AutoSearch scope, startup state, ignore rules, content exclusion, theme, and options storage.
* **Check types.** Grammar, style, autocorrect, autocomplete, AI writing assistant, and checking modes.
* **UI elements.** Suggestion pop-up, proofread dialog, badge, and Settings dialog.
* **Languages and dictionaries.** Default language, auto-detection, UI localization, user and organization dictionaries.
* **Callbacks.** Event hooks for analytics, usage tracking, and error handling.


# Startup and behavior

#### Startup state

WProofreader starts in the enabled state by default. To start it disabled (users can turn it on from the badge):

```js
autoStartup: false,
```

#### Auto-destroy

By default, `autoDestroy` is `false`, but it's automatically enabled for instances initialized using `autoSearch`. It removes the WProofreader instance when the editable container is removed from the page, so you don't need to handle destruction manually.

```js
autoDestroy: true,
```

#### AutoSearch scope

When `autoSearch` is enabled, WProofreader activates in the focused editable area. You can control which elements it targets using one of these options (don't use both at the same time):

`enableAutoSearchIn` limits WProofreader to specific elements by class, ID, data attribute, or HTML element type. `disableAutoSearchIn` excludes specific elements. If both are set, `enableAutoSearchIn` takes priority and `disableAutoSearchIn` is ignored.

```js
enableAutoSearchIn: ['.my-editor'],
// or
disableAutoSearchIn: ['#skip-this', 'textarea'],
```

**Enabling proofreading in inputs**

WProofreader is disabled in `<input>` elements by default due to compatibility limitations. To enable it:

```js
enableAutoSearchIn: ['input'],
```

#### Ignore rules

These options control what WProofreader skips during checking.

| Option                      | Default | Skips                        |
| --------------------------- | ------- | ---------------------------- |
| `ignoreAllCapsWords`        | `false` | Words like "EXAMPLE"         |
| `ignoreDomainNames`         | `true`  | URLs and email addresses     |
| `ignoreWordsWithMixedCases` | `false` | Words like "WebSpellChecker" |
| `ignoreWordsWithNumbers`    | `true`  | Words like "v2"              |

To change the default, set the option to the opposite value. Note that user preferences stored in the browser take priority over these defaults. To prevent that, add the option name to `disableOptionsStorage`.

**Disabled rules**

To disable specific grammar or style guide rules by their rule ID or category ID for all users:

```js
disabledRules: ['UPPERCASE_SENTENCE_START'],
```

#### Content exclusion

**HTML elements**

To skip checking inside specific HTML elements, provide tag names separated by `|`. Default: `'pre|style|script'`.

```js
ignoreElements: 'pre|style|script|table',
```

**CSS classes and data attributes**

```js
ignoreClasses: ['ignore-checking'],
ignoreAttributes: ['data-wsc-ignore-checking'],
```

**Skip highlighting in ignored segments**

When part of a word falls inside an ignored element, the error is still detected but highlighted by default. To skip highlighting in these cases (useful in track changes modes):

```js
skipMarkupForIgnoredText: true,
```

#### Theme

The default theme is `'default'`. Available values: `'default'`, `'gray'`, `'dark'`, `'custom'`, `'ckeditor5'`, `'tinymce'`.

```js
theme: 'gray',
```

The `'gray'` theme works well with most rich text editors. The `'ckeditor5'` and `'tinymce'` themes match those editors' look and feel. The `'custom'` theme lets you write your own CSS styles.

#### Minimum word length

The minimum number of characters in a word for it to be spell checked. Default is 3. This option applies to algorithmic spell check only.

```js
minWordLength: 2,
```

#### Options storage

By default, user preferences aren't stored in the browser between sessions. After a page reload, all options reset to the admin-defined defaults.

To enable storage for all options:

```js
disableOptionsStorage: [],
```

To enable storage for specific options only:

```js
disableOptionsStorage: ['all'],
// then override individual options you want stored
```

Possible values: `'options'` (all ignore options except lang), `'ignoreAllCapsWords'`, `'ignoreDomainNames'`, `'ignoreWordsWithMixedCases'`, `'ignoreWordsWithNumbers'`, `'spellingSuggestions'`, `'grammarSuggestions'`, `'styleGuideSuggestions'`, `'autocorrect'`, `'autocomplete'`, `'lang'`, `'all'`. Set to `[]` to enable storage for all options.

#### Synchronize options across instances

By default, ignore options and language are synchronized across all WProofreader instances on the page. To disable:

```js
syncOptions: false,
```

#### Restore native spell check

When WProofreader is disabled by the user, browser spell check stays off. To restore the browser's native spell check when WProofreader is disabled:

```js
restoreNativeSpellCheck: true,
```

#### Caching

Request response caching is disabled by default. When enabled, it caches responses, words added to the dictionary, ignored suggestions, and disabled rules. The cache resets every 24 hours.

{% hint style="info" %}
This is useful for projects where the document isn't reloaded frequently and content doesn't change much, similar to Google Docs.
{% endhint %}

```js
cache: true,
```

#### Requests per check

The `requestTokensCount` option controls the maximum number of sentences sent per request. The default value of `4` is optimized for performance but can be adjusted if needed.

```js
requestTokensCount: 6,
```


# UI elements


# Suggestion pop-up

The suggestion pop-up appears when a user hovers over a marked word. It shows spelling, grammar, or style suggestions along with action items.

#### Number of suggestions by type

Use `suggestionsCountByType` to set different limits per suggestion type. Default: `{ spelling: 3, grammar: 5, style: 6 }`.

```js
suggestionsCountByType: {
  spelling: 5,
  grammar: 3,
  style: 4
}
```

**Legacy option**

The older `suggestionsCount` option sets a single limit for all types. If `suggestionsCount` is set to a value other than `3`, it takes priority over `suggestionsCountByType`.

```js
suggestionsCount: 5
```

#### More suggestions submenu

By default, additional suggestions aren't shown. To add a "More suggestions" submenu:

```js
moreSuggestionsCount: 5,
```

#### Hide suggestion type labels

To hide the suggestion type label (spelling, grammar, style) in the pop-up:

```js
disableTypeInSuggestionPopup: true,
```

#### Hide suggestion descriptions

To hide the explanation text for grammar and style issues:

```js
disableProblemDescription: true
```

This applies to both the suggestion pop-up and the proofread dialog.

#### Action items

The `actionItems` parameter controls which commands appear in the suggestion pop-up, badge, and proofread dialog. Default:

```js
actionItems: ['addWord', 'ignoreAll', 'ignore', 'report', 'disableRule', 'settings', 'toggle', 'proofreadDialog']
```

Not all actions appear in every location. The suggestion pop-up shows suggestion-specific actions, while the badge only shows **Settings**, **Toggle**, and **Proofread in dialog**.

| Value               | Description                                                                                                                                       |
| ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
| `'addWord'`         | Add the word to the user dictionary.                                                                                                              |
| `'ignore'`          | Ignore this occurrence of the word.                                                                                                               |
| `'ignoreAll'`       | Ignore all occurrences of the word in the current session.                                                                                        |
| `'report'`          | Report a suggestion as incorrect.                                                                                                                 |
| `'disableRule'`     | Disable the rule behind the suggestion for the current browser session. Errors matching this rule won't be underlined until the page is reloaded. |
| `'settings'`        | Open the Settings dialog.                                                                                                                         |
| `'toggle'`          | Enable or disable WProofreader.                                                                                                                   |
| `'proofreadDialog'` | Open the proofread in dialog mode.                                                                                                                |

To prevent users from adding words to their dictionary, remove `'addWord'`. To hide the settings icon, remove `'settings'`. To hide the report option, remove `'report'`.


# Dialog

#### Turn off the proofreading dialog

Disable the dialog-based proofreading mode by setting `disableDialog` to `true`. Proofreading will run only inline, and the "proofread in dialog" option will be unavailable. By default, the dialog is available.

```javascript
disableDialog: true
```

***

#### Embed the dialog in a sidebar

Place the dialog inside a reserved section of the interface with `proofreadDialogContainer`. By default, the dialog opens as a floating window.

```javascript
proofreadDialogContainer: '#sidebar-dialog'
```

{% hint style="info" %}

* This mode is useful when a sidebar or reserved area should display all suggestions in one place.
* Requires `globalBadge: true`.
* If the sidebar width differs from the default 340px, adjust `badgeOffsetX` and `badgeOffsetY` to position the badge accordingly.
* See the [sidebar demo](https://demos.webspellchecker.com/wproofreader-sidebar.html).
  {% endhint %}

<figure><img src="/files/zqA2XYekVzvahbktjmCJ" alt=""><figcaption></figcaption></figure>

#### Show one dialog for all fields

Aggregate suggestions from all editable fields with `globalProofreadDialog` into a single **Proofread in dialog** window. This is enabled by default; set to `false` to open a separate dialog per field.

```javascript
globalProofreadDialog: true
```

<figure><img src="/files/WVz5EJAWrWT7YKfjE2oA" alt=""><figcaption></figcaption></figure>


# Badge

The badge is a floating UI control that represents the state of WProofreader and provides quick access to actions such as enabling/disabling proofreading, opening the **Proofread in dialog** mode, and accessing the settings.\
By default:

* A **minimized dot-style badge** (gray, orange, or red depending on state) is displayed.
* On hover, it **expands** to a full-size version with action icons.
* The badge is placed per field unless configured globally.

<figure><img src="/files/QoY3TVFvz0aHJsh5VS0X" alt=""><figcaption></figcaption></figure>

The badge can be customized for behavior, layout, size, and placement using the following options.

#### Hide the badge

Turn off the badge UI by setting `enableBadgeButton` to `false`. By default, the badge is visible.

```js
enableBadgeButton: false
```

{% hint style="info" %}
When disabled, all badge actions move to the suggestion pop-up.
{% endhint %}

#### Show language selector in the badge

Expose a language switcher inside the badge with `enableLanguagesInBadgeButton`. Disabled by default.

**Use when:** you want users to be able to switch the checking language directly from the badge.

```js
enableLanguagesInBadgeButton: true
```

#### Compact badge

A simplified badge that shows only the number of detected suggestions. Clicking the badge opens the proofread in dialog window. Most icons are removed, leaving only the suggestion counter and an enable/disable toggle. Works only when dialog mode is enabled (`disableDialog: false`).

```js
compactBadge: true,
```

#### Full-size badge

By default, the badge appears as a small dot in the corner of the editor and expands to its full size on hover. This works well for small input fields where the full badge would overlay the text. To display the badge at its full size permanently:

```js
fullSizeBadge: true,
```

#### Global badge

By default, each text field has its own badge. To display a single page-level badge for all fields:

```js
globalBadge: true,
```

{% hint style="info" %}
This is useful when you want a unified control for proofreading across multiple fields. It's also required if you're using the embedded dialog mode with `proofreadDialogContainer`, where the global badge acts as a single entry point for all suggestions.
{% endhint %}

#### Adjust badge position

Use `badgeOffsetX`, `badgeOffsetY`, and `badgeZIndex` to fine-tune placement and layering.

**Use when:** the badge overlaps other UI or the page uses fixed headers/sidebars.

```javascript
badgeOffsetX: 16
badgeOffsetY: 12
badgeZIndex: 9999
```

{% hint style="info" %}

* Offsets shift the badge horizontally/vertically; `badgeZIndex` raises it above other elements.

* Adjust offsets to align with custom sidebars or containers shown near the badge.
  {% endhint %}

* Offsets shift the badge horizontally/vertically; `badgeZIndex` raises it above other elements.

* Adjust offsets to align with custom sidebars or containers shown near the badge.

#### Badge action items

The badge shows a subset of the `actionItems`: **Settings**, **Toggle** (enable/disable), and **Proofread in dialog**. To control which of these appear, adjust the `actionItems` parameter. For example, to show only the proofreading dialog in the badge:

```js
actionItems: ['proofreadDialog'],
```


# Settings

The Settings dialog lets users manage their proofreading preferences. It contains these sections: **General**, **Options** (ignore rules), **Languages**, **Dictionaries**, and **About**.

<div align="left"><figure><img src="/files/SIh4w3N7rUf4Arkxaq4P" alt="" width="375"><figcaption></figcaption></figure></div>

| Section      | What users can do                                                                                                 | Admin options                                                              |
| ------------ | ----------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------- |
| General      | Enable or disable spelling autocorrect, autocomplete suggestions, style guide, spelling, and grammar suggestions. | Hide the section to lock users into predefined settings.                   |
| Options      | Configure ignore rules for all-caps words, domain names, mixed case words, and words with numbers.                | Predefine ignore rules for all users.                                      |
| Languages    | Select the default language for checking.                                                                         | Set a predefined language and hide the section.                            |
| Dictionaries | Add and remove words, create and manage user dictionaries.                                                        | Hide dictionary management, set a predefined dictionary.                   |
| About        | View WProofreader version and copyright info.                                                                     | Remove with `removeBranding: true` (self-hosted and advanced Cloud plans). |

#### Hiding sections

To hide specific sections, list only the ones you want to keep using the `settingsSections` parameter. Default: `['dictionaries', 'languages', 'general', 'options']`. The About section can't be removed through this option (use `removeBranding` instead).

```js
settingsSections: ['languages', 'dictionaries', 'options'],
```

#### Hiding dictionary management

To prevent users from creating, renaming, or deleting dictionaries while still allowing them to add and remove words:

<div align="left"><figure><img src="/files/dF2woacoTpc7USAjtzJX" alt="" width="375"><figcaption></figcaption></figure></div>

```js
disableDictionariesPreferences: true,
```

#### Removing branding

For paid plans, branding is removed automatically. The `removeBranding` option is enabled by default for self-hosted and paid cloud subscriptions.

<div align="left"><figure><img src="/files/WFjG0uvlf5R3dSWSiRvC" alt="" width="375"><figcaption></figcaption></figure></div>

<div align="left"><figure><img src="/files/xRzya3uhO8wtxk4lZvhl" alt="" width="265"><figcaption></figcaption></figure></div>

If you need to explicitly control it:

```js
removeBranding: true,
```


# Languages and dictionaries

#### Default language

The default language is `'auto'`, which detects the input language automatically. Auto-detection covers around 80 languages and requires at least three correctly spelled words.

To set a specific language for all users, use a locale code from the [supported languages](https://docs.wproofreader.com/features/supported-languages) list:

```js
lang: 'de_DE',
```

Users can change the language from the Settings dialog, but after a page reload, the admin-defined default is restored (unless options storage is enabled for `lang`).

#### Language auto-detection priorities

When `lang` is set to `'auto'`, the detected language maps to a default dialect. To override which dialect is used for a detected language:

```js
autoLangPriorities: {
  en: 'en_GB',
  fr: 'fr_CA'
},
```

In this example, when auto-detection identifies English, it uses British English instead of the default American English.

#### UI localization

The WProofreader interface defaults to English (`localization: 'en'`). To change it:

```js
localization: 'de',
```

To auto-detect the localization language from browser settings:

```js
detectLocalizationLanguage: true,
```

If auto-detection fails, the value in `localization` (or the default) is used as a fallback.

#### User dictionary

To assign a shared user dictionary for all users:

```js
userDictionaryName: 'shared_dictionary',
```

All words added by users via the **Add word** command go to this dictionary. If your app has authentication, you can assign different dictionaries per user.

To prevent users from creating, renaming, or deleting dictionaries while still allowing them to add and remove words, combine it with:

```js
disableDictionariesPreferences: true,
```

#### Organization dictionary

To connect organization dictionaries by their IDs (comma-separated):

```js
customDictionaryIds: '100694, 100695',
```

For the Cloud version, dictionary IDs are assigned automatically when you create a dictionary on the [Custom dictionary](https://app.wproofreader.com/custom-dictionary) page in the admin panel. For self-hosted, you assign dictionary IDs manually. For details, refer to the [Organization dictionary](/v6.10.0.0/features/custom-dictionary/organization-dictionary) overview.


# Check types

#### Grammar check

Grammar check is enabled by default. To disable it:

```js
enableGrammar: false,
```

When grammar check is disabled, only spell check and style check run. Users won't be able to enable grammar from the Settings dialog or the grammar toggle in the UI.

#### Style check

Style suggestions are based on the rules created in the style guide. They're enabled by default. To disable them for users:

```js
disableStyleGuide: true,
```

#### As-you-type proofreading

As-you-type proofreading is enabled by default. To disable it and allow proofreading only through the dialog mode:

```js
proofreadAsYouType: false,
```

#### Spelling autocorrect

Autocorrect automatically fixes common spelling mistakes as users type. It's enabled by default. To disable it:

```js
autocorrect: false,
```

Users can still toggle autocorrect from the Settings dialog. To prevent this, hide the General section using `settingsSections`. If you need to prevent the user's preference from persisting, add `'autocorrect'` to `disableOptionsStorage`.

#### Text autocomplete

Autocomplete suggests the next word or short phrase based on context. Currently available for English only. Users accept suggestions with `Tab` or the `Right arrow` key. It's disabled by default. To enable it:

```js
autocomplete: true,
```

Users can toggle autocomplete from the Settings dialog.

#### AI writing assistant

The AI writing assistant (AIWA) is disabled by default. To enable it:

```js
aiWritingAssistant: true,
```

Users can initiate AIWA by selecting text (minimum 100 characters), clicking the badge, and choosing an action such as rewrite, shorten, expand, etc.

#### Suggestion visibility

You can control which suggestion types are visible to users without disabling the backend checks. All are `true` by default.

```js
spellingSuggestions: true,
grammarSuggestions: true,
styleGuideSuggestions: true,
```

Setting any of these to `false` hides the suggestions in the UI, but requests are still sent to the backend. Users can turn them back on from the General section of the Settings dialog.

#### Check on space

By default, checking is triggered as the user types. To also trigger a check when the user presses space for faster underlining:

```js
checkOnSpace: true,
```

{% hint style="warning" %}
Enabling this option results in more words checked, as a request is sent after each space pressed by the user.
{% endhint %}

#### Language configuration profile

The `checkKit` option lets you choose between algorithmic, AI-powered, or mixed checking modes.

{% hint style="info" %}
Not all configurations are available for all languages. The AI component is currently available for English, German, and Spanish. For languages without AI support, only the algorithmic check kit (`'lt_hs'`) is available. If the specified configuration isn't supported for the selected language, the default configuration is used.
{% endhint %}

| Value         | Description                                                                                                             |
| ------------- | ----------------------------------------------------------------------------------------------------------------------- |
| `'lt_hs'`     | Algorithmic engines only, no AI.                                                                                        |
| `'ai_lt_hs0'` | AI provides grammar and spelling suggestions. Algorithmic engine highlights spelling errors without suggestions.        |
| `'ai_lt_hs1'` | AI provides grammar and spelling suggestions, with algorithmic support where AI doesn't offer coverage.                 |
| `'ai_lt'`     | AI provides grammar and spelling suggestions. Algorithmic grammar runs in parallel but AI takes precedence on overlaps. |
| `'ai'`        | AI only, no algorithmic engines.                                                                                        |


# Service connection

These options tell WProofreader where to send spell check and grammar check requests.

#### Cloud

```js
serviceId: 'your-service-ID'
```

You can find your Service ID on the [Credentials](https://app.wproofreader.com/credentials) page in the admin panel.

#### Self-hosted

```js
serviceProtocol: 'https',
serviceHost: 'your_host_name',
servicePort: '443',
servicePath: 'wscservice/api'
```

You also need to point the `wscbundle.js` script `src` to your server. For NPM SDK integration, set the `srcUrl` option as well.

#### Request headers

If your server requires authentication, use the `requestHeaders` function to pass headers with every request. Only the `Authorization` header is supported. For cross-site requests, set `withCredentials: true`.

```js
requestHeaders: function() {
  return {
    Authorization: 'Bearer ' + localStorage.getItem('authorization')
  };
},
withCredentials: true,
```


# Callbacks

WProofreader provides callback functions for tracking events and integrating with your application logic. All callbacks are set in the configuration alongside other options.

| Callback                         | Triggered when                                                                                                                           |
| -------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- |
| `onLoad`                         | WProofreader is loaded and ready to use.                                                                                                 |
| `onToggle`                       | WProofreader is enabled or disabled.                                                                                                     |
| `onCommitOptions`                | A user changes options like `lang`, `ignoreAllCapsWords`, `ignoreDomainNames`, `ignoreWordsWithMixedCases`, or `ignoreWordsWithNumbers`. |
| `onAddWordToUserDictionary`      | A word is added to the user dictionary.                                                                                                  |
| `onDeleteWordFromUserDictionary` | A word is deleted from the user dictionary.                                                                                              |
| `onCheckStatusChange`            | Text checking starts or finishes. Returns `'start'` or `'finish'`. Multiple cycles can occur due to asynchronous requests.               |
| `onStatistics`                   | A user interacts with a suggestion or dictionary (replace, ignore, add, delete, report, disable, accept, discard, mismatch, generate).   |
| `onUsage`                        | A check, autocorrect, autocomplete, or generate request is executed. Useful for monitoring usage and client-side analytics.              |
| `onErrorRequest`                 | A request ends with an error.                                                                                                            |

#### onStatistics

The `onStatistics` callback is triggered whenever a user interacts with a suggestion or dictionary. It captures the action type, input text, and metadata such as rule, language, and context.

**Actions:**

| Action     | Description                                                |
| ---------- | ---------------------------------------------------------- |
| `replace`  | User accepted a suggestion and replaced the original text. |
| `ignore`   | User ignored a suggestion.                                 |
| `add`      | Word was added to the user dictionary.                     |
| `delete`   | Word was removed from the user dictionary.                 |
| `report`   | User reported a suggestion as incorrect.                   |
| `disable`  | User disabled the rule behind a suggestion.                |
| `accept`   | User accepted an autocomplete suggestion.                  |
| `discard`  | Autocomplete suggestion was dismissed without interaction. |
| `mismatch` | Autocomplete suggestion didn't match user input.           |
| `generate` | User used a suggestion from the AI writing assistant.      |

**Suggestion types** returned in `data.type`: `spelling`, `grammar`, `style`, `autocomplete`, `autocorrect`.

For callback signatures and full parameter details, refer to the [Configuration reference](https://webspellchecker.com/docs/api/wscbundle/Options.html).


# JavaScript frameworks

If your web app is written using Angular, React, Vue.js or any other popular framework, you do not need to do anything special to integrate the WProofreader spelling/grammar checking component.

You don't need to worry about importing, building, bundling or instantiating a WProofreader object as you might get used to doing with other components. WProofreader is written in pure JavaScript and it has all the required mechanisms for auto-detecting the editable fields on the page and auto-initializing itself there.

Here are some additional notes that might help you with the further configuration.

1\. Find the main HTML page that is served when someone visits your website or app.

For example:

* For Angular with Angular CLI, it is **src/index.html**
* For React and create-react-app, it is **public/index.html**
* For Vue and Vue CLI, it is **public/index.html**

2\. Add WProofreader **configuration** and **wscbundle.js** scripts inside the body tag. It is recommended to have it at the very end of the body before the closing tag `</body>`.

For details, refer to our standard initialization flow described in [Initialization options](/v6.10.0.0/integrations/initialization/initialization-options).

### Using NPM

For integration of WProofreader you can alternatively utilizing our [NPM package](https://www.npmjs.com/package/@webspellchecker/wproofreader-sdk-js). Simply follow the installation instructions, and proceed to initialize WProofreader within your editor.

Opting for our NPM package grants you access to the full range of functionalities available in a standard installation. Upon invoking any method from the bundle, it will initiate a download, subsequently making `window.WEBSPELLCHECKER` accessible for your use.

<br>


# Rich text editors


# CKEditor 5

**WProofreader plugin for CKEditor 5** inherits all the functionality of the WProofreader component with slight adaptation to the view and features of the editor. Right now the plugin is just a “wrapper” for the classic WProofreader. Thus, WProofreader will be more native to CKEditor 5 build procedure.

The main differences between the plugin and the classic WProofreader are:

* part of the build and configuration of CKEditor 5;
* tailored color theme for CKEditor 5 based on previously discussed styles;
* implemented sync in the case of real-time collaboration features and multi-root plugin;
* better work of WProofreader as you type mode in the case of multi-root plugin (languages and settings synchronization between instances).

For more details, please refer to the [official repo ](https://www.npmjs.com/package/@webspellchecker/wproofreader-ckeditor5)or [NPM package](https://github.com/WebSpellChecker/wproofreader-ckeditor5) of the WProofreader plugin for CKEditor 5.

If your preference is to use the plugin instead of the classic WProofreader initialization, please follow the steps below.

1\. Clone [CKEditor 5 Classic editor](https://ckeditor.com/docs/ckeditor5/latest/builds/guides/quick-start.html#classic-editor):

```javascript
git clone -b stable git@github.com:ckeditor/ckeditor5-build-classic.git
```

2\. Go to the editor folder:

```javascript
cd ckeditor5-build-classic
```

3\. Install all the required dependencies:

```javascript
npm  install
```

4\. Install the WProofreader plugin:

```javascript
npm  install @webspellchecker/wproofreader-ckeditor5 --save-dev
```

5\. Open **/src/ckeditor.js** file.

6\. Import the WProofreader plugin:

```javascript
import WProofreader from '@webspellchecker/wproofreader-ckeditor5/src/wproofreader';
```

{% hint style="info" %}
To add WProofreader in a bundle with CKEditor 5 with **TypeScript** you need to use the following:

\
`//@ts-ignore`

`import WProofreader from '@webspellchecker/wproofreader-ckeditor5/src/wproofreader';`
{% endhint %}

7\. Add WProofreader plugin to **ClassicEditor.builtinPlugins**:

```javascript
ClassicEditor.builtinPlugins = [
    ...,
    WProofreader
];
```

8\. Add WProofreader toolbar button to **ClassicEditor.defaultConfig**:

The toolbar button is available starting from [version 2.0.0 of the plugin](https://github.com/WebSpellChecker/wproofreader-ckeditor5/blob/master/CHANGELOG.md) and the general [WebSpellChecker package version 5.8.0](https://webspellchecker.com/release-notes/v5-8-0/).

```
ClassicEditor.defaultConfig = {
    ...,
    toolbar: {
        items: [
            ...,
            'wproofreader'
        ]
    }
}
```

9\. Add the **wproofreader** field and its options to **ClassicEditor.defaultConfig**:

In the case of the Cloud version, **serviceId** and **srcUrl** are mandatory options.

```javascript
ClassicEditor.defaultConfig = {
    ...,
    wproofreader: {
		lang: 'en_US', // set the default language
                serviceId: 'your-service-ID', // the activation key for the Cloud-based version only
                srcUrl: 'https://svc.webspellchecker.net/spellcheck31/wscbundle/wscbundle.js'
    }
}
```

In the case of the on-premise version, you need to clearly define a path to the WebSpellChecker/WProofreader server:

```javascript
ClassicEditor.defaultConfig = {
    ...,
    wproofreader: {
		lang: 'en_US', // set the default language
                serviceProtocol: 'https',
		serviceHost: 'your_host_name',
		servicePort: '443',
		servicePath: 'virtual_directory/api',
                srcUrl: 'https://your_host_name/virtual_directory/wscbundle/wscbundle.js'
    }
}
```

The full list of configuration options for WProofreader is available in [API docs](/v6.10.0.0/api-reference/overview).

10\. Rebuild the bundle:

```javascript
npm run build
```

That's it. Now you should be able to use the spelling and grammar checking functionality of WProofreader with CKEditor 5.

Try it out on the default sample page: **/sample/index.html**.


# CKEditor 4

This guide covers how to add proofreading to CKEditor 4. It applies to both Cloud and self-hosted deployments.

CKEditor 4 reached its end of life in June 2023. CKSource offers an [Extended Support Model](https://ckeditor.com/ckeditor-4-support/) with security fixes under a commercial license. WebSpellChecker continues to support its proofreading products for CKEditor 4 for existing clients, but recommends [CKEditor 5](https://wproofreader.com/integrations/ckeditor5) for new projects.

[See live demo](https://demos.webspellchecker.com/wproofreader-ckeditor4.html)

### Prerequisites

You'll need an active WProofreader subscription or trial. [Sign up for a free trial or choose a plan](https://wproofreader.com/sdk#pricing)

For the Cloud version, you'll need a Service ID. You can find it on the [Credentials](https://app.wproofreader.com/credentials) page in the admin panel after signing up. For self-hosted, you'll need the endpoint of your WProofreader application (protocol, host, port, and path) to specify in the configuration parameters.

### Choose your proofreading product

There are two proofreading products available for CKEditor 4: SCAYT (legacy) and WProofreader. You can use either one, but not both at the same time.

|                               | SCAYT (legacy)                                                              | WProofreader                                                                                                                               |
| ----------------------------- | --------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
| Status                        | Legacy, maintained for existing clients                                     | Actively developed                                                                                                                         |
| Toolbar button                | Yes, dedicated ABC button in CKEditor toolbar                               | No dedicated CKEditor 4 button (uses its own floating UI)                                                                                  |
| Suggestions UI                | Right-click context menu (uses CKEditor's native UI)                        | Badge in the bottom corner of the editor (similar to Grammarly), hover suggestions in as-you-type mode, and a separate proofreading dialog |
| Spell check                   | Yes                                                                         | Yes                                                                                                                                        |
| Grammar and punctuation check | Yes                                                                         | Yes                                                                                                                                        |
| Spelling autocorrect          | No                                                                          | Yes                                                                                                                                        |
| Text autocomplete             | No                                                                          | Yes                                                                                                                                        |
| AI writing assistant (AIWA)   | No                                                                          | Yes                                                                                                                                        |
| Custom dictionaries           | Yes                                                                         | Yes                                                                                                                                        |
| Customization options         | [SCAYT parameters](https://docs.wproofreader.com/integrations/legacy-scayt) | [Configuration reference](https://webspellchecker.com/docs/api/wscbundle/Options.html) (more options available)                            |
| Installation                  | Included by default in CKEditor 4 standard build                            | Requires adding the WProofreader script or npm SDK                                                                                         |

If you're starting a new integration, WProofreader is recommended. It offers more features and is actively developed. If you're already using SCAYT and don't need the additional features, you can continue using it.

### SCAYT plugin (legacy)

SCAYT is included by default in the CKEditor 4 standard build. The free version uses WebSpellChecker's free services and displays a banner ad. To remove the ad and unlock full functionality, you'll need a paid subscription.

For setup and configuration instructions, refer to the [SCAYT plugin for CKEditor 4](https://docs.wproofreader.com/integrations/legacy-scayt/scayt-plugin-for-ckeditor-4) guide.

[See SCAYT demo](https://webspellchecker.com/wsc-scayt-ckeditor4/)

### WProofreader integration

WProofreader doesn't have a dedicated plugin for CKEditor 4 but integrates through the script-based or NPM SDK methods. It provides its own UI with a badge in the bottom corner of the editor (similar to Grammarly) that shows the total number of issues found, hover suggestions as you type, and a proofreading dialog for reviewing all issues at once.

#### Recommended CKEditor 4 options

When using WProofreader with CKEditor 4, these config options can help match the look and scope:

```js
theme: 'gray',  // adjusts WProofreader's color theme to look more native to CKEditor 4
enableAutoSearchIn: ['.cke_wysiwyg_frame'],  // limits WProofreader to CKEditor 4 areas only
```

#### Script-based integration

The simplest approach is `autoSearch`, which detects CKEditor 4's editable area automatically when a user focuses on it. For setup instructions, refer to the [Initialize using autoSearch](/v6.10.0.0/integrations/initialization/initialization-options#initialize-using-autosearch) guide.

**Using init() for immediate activation**

If you want proofreading to start on editor load without waiting for focus, use `init()` inside CKEditor's `instanceReady` event:

```html
<script>
  window.WEBSPELLCHECKER_CONFIG = {
    autoSearch: true,
    autoDestroy: true,
    serviceId: 'your-service-ID'
  };
</script>

<script src="https://svc.webspellchecker.net/spellcheck31/wscbundle/wscbundle.js"></script>

<div id="ckeditor4-editor">
  <p>Your text here.</p>
</div>

<script>
  CKEDITOR.disableAutoInline = true;

  CKEDITOR.on('instanceReady', function(event) {
    var editor = event.editor;
    WEBSPELLCHECKER.init({
      container: editor.window.getFrame()
        ? editor.window.getFrame().$
        : editor.element.$
    });
  });

  CKEDITOR.replace('ckeditor4-editor', {});
</script>
```

The `container` value depends on CKEditor 4's rendering mode. In iframe mode (default), it uses `editor.window.getFrame().$`. In inline mode, it falls back to `editor.element.$`. The ternary expression handles both cases automatically.

Setting `autoSearch: true` and `autoDestroy: true` alongside `init()` ensures WProofreader recovers correctly when CKEditor switches between editing modes.

For self-hosted deployments, replace `serviceId` with the server connection parameters and update the script `src` to point to your server:

```html
<script>
  window.WEBSPELLCHECKER_CONFIG = {
    autoSearch: true,
    autoDestroy: true,
    serviceProtocol: 'https',
    serviceHost: 'your_host_name',
    servicePort: '443',
    servicePath: 'wscservice/api'
  };
</script>

<script src="https://your_host_name/wscservice/wscbundle/wscbundle.js"></script>
```

#### NPM SDK integration

The WProofreader SDK npm package is a universal integration method that works with any editor, including CKEditor 4. It's a good fit for JavaScript framework projects (React, Angular, Vue) or when you use multiple editors and want a single proofreading dependency.

For setup instructions, refer to the [Initialize using npm SDK](/v6.10.0.0/integrations/initialization/initialization-options/initialize-using-npm-sdk) guide. It covers installation, configuration, and usage with `autoSearch` and `init()`.

### Remove other spell checkers

If you're switching from SCAYT to WProofreader, remove the SCAYT plugin to avoid conflicts. Add the `removePlugins` parameter to your CKEditor `config.js` file:

```js
config.removePlugins = 'scayt';
```

If your CKEditor 4 build also includes the WSC Dialog plugin, remove it as well. The WSC Dialog plugin [reached its end of life](https://webspellchecker.com/blog/2020/12/02/end-of-life-for-spell-checker-dialog-plugin-for-ckeditor-4/) in December 2021.

```js
config.removePlugins = 'scayt,wsc';
```

### What's next

After integration, you can customize your proofreading setup further:

* [Configuration reference](https://webspellchecker.com/docs/api/wscbundle/Options.html) for the full list of WProofreader options (default language, UI localization, check types, custom dictionaries, and more).
* [SCAYT parameters for CKEditor 4](https://docs.wproofreader.com/integrations/legacy-scayt/scayt-parameters-for-ckeditor-4) for SCAYT-specific configuration.
* [Features overview](https://wproofreader.com/features) to explore custom dictionaries, style guide rules, AI writing assistant, and other capabilities.
* [Demos](https://demos.webspellchecker.com/) to see working examples with CKEditor 4 and other editors.

### FAQ

#### Can I use SCAYT and WProofreader at the same time?

It's technically possible, but not recommended. Running both at the same time will cause confusion as users will see duplicate underlines for the same errors. If you're switching to WProofreader, remove the SCAYT plugin first.

#### Should I migrate from SCAYT to WProofreader?

If you need features like spelling autocorrect, text autocomplete, AI writing assistant, or style guide rules, WProofreader is the better choice. If your current SCAYT setup meets your needs, you can continue using it.

#### Is CKEditor 4 still supported?

CKEditor 4 reached its end of life in June 2023. CKSource offers an Extended Support Model with security fixes under a commercial license. For new projects, consider [CKEditor 5](https://wproofreader.com/integrations/ckeditor5), which has a dedicated WProofreader plugin.

#### How do I migrate from CKEditor 4 to CKEditor 5?

This is a CKEditor migration, not a WebSpellChecker one. Refer to CKEditor's [migration guide](https://ckeditor.com/docs/ckeditor5/latest/updating/ckeditor4/migration-from-ckeditor-4.html). Once you've migrated to CKEditor 5, follow the [CKEditor 5 integration guide](https://docs.wproofreader.com/integrations/rich-text-editors/ckeditor-5) for WProofreader, which uses a dedicated plugin with a native toolbar button. Note that CKEditor 5 requires a separate license from CKSource.


# Froala Editor

This guide covers how to add WProofreader spelling, grammar, and style checking to Froala Editor. It applies to both Cloud and self-hosted deployments.

[See live demo](https://demos.webspellchecker.com/wproofreader-froala.html)

### Prerequisites

You'll need an active WProofreader subscription or trial. [Sign up for a free trial or choose a plan](https://wproofreader.com/sdk#pricing)

For the Cloud version, you'll need a Service ID. You can find it on the [Credentials](https://app.wproofreader.com/credentials) page in the admin panel after signing up. For self-hosted, you'll need the endpoint of your WProofreader application (protocol, host, port, and path) to specify in the configuration parameters.

### Choose your integration method

There are two ways to integrate WProofreader with Froala Editor.

| Method       | Best for                                                                                                                 |
| ------------ | ------------------------------------------------------------------------------------------------------------------------ |
| Script-based | Quick setup without a build process. Add the config and script to your HTML page.                                        |
| NPM SDK      | JavaScript framework projects (React, Angular, Vue) or setups with multiple editors sharing one proofreading dependency. |

Both methods work with any Froala Editor version.

### Script-based integration

The simplest approach is `autoSearch`, which detects Froala Editor's editable area automatically when a user focuses on it. For setup instructions, refer to the Initialize using autoSearch guide.

#### Using init() for immediate activation

If you want proofreading to start on editor load without waiting for focus, use `init()` inside Froala's `initialized` event. This starts proofreading as soon as the editor is ready.

html

```html
<script>
  window.WEBSPELLCHECKER_CONFIG = {
    autoSearch: true,
    autoDestroy: true,
    serviceId: 'your-service-ID'
  };
</script>

<script src="https://svc.webspellchecker.net/spellcheck31/wscbundle/wscbundle.js"></script>

<div id="froala-editor">
  <p>Your text here.</p>
</div>

<script>
  new FroalaEditor('#froala-editor', {
    iframe: true,
    events: {
      'initialized': function() {
        WEBSPELLCHECKER.init({
          container: this.$iframe ? this.$iframe[0] : this.el
        });
      }
    }
  });
</script>
```

The `container` value depends on Froala's rendering mode. When `iframe: true` is set, Froala renders content inside an iframe, so the container should be `this.$iframe[0]`. Otherwise, it falls back to `this.el` (the editable element itself). The ternary expression handles both cases automatically.

Setting `autoSearch: true` and `autoDestroy: true` alongside `init()` ensures WProofreader recovers correctly when Froala switches between editing modes (for example, toggling WYSIWYG and code view).

For self-hosted deployments, replace `serviceId` with the server connection parameters and update the script `src` to point to your server:

```html
<script>
  window.WEBSPELLCHECKER_CONFIG = {
    autoSearch: true,
    autoDestroy: true,
    serviceProtocol: 'https',
    serviceHost: 'your_host_name',
    servicePort: '443',
    servicePath: 'wscservice/api'
  };
</script>

<script src="https://your_host_name/wscservice/wscbundle/wscbundle.js"></script>
```

### NPM SDK integration

The WProofreader SDK npm package is a universal integration method that works with any editor, including Froala. It's a good fit for JavaScript framework projects (React, Angular, Vue) or when you use multiple editors and want a single proofreading dependency.

For setup instructions, refer to the [Initialize using npm SDK](/v6.10.0.0/integrations/initialization/initialization-options/initialize-using-npm-sdk) guide. It covers installation, configuration, and usage with `autoSearch` and `init()`.

### Remove other spell checkers

If you've been using SCAYT or other spell check tools with Froala, remove them to avoid conflicts. To identify *SCAYT* references in your project, search for: `SCAYT`, `spell_checker.min.js`, `spell_checker.min.css`, `scaytCustomerId`, `scaytAutoload`, `pluginsEnabled: ['spellChecker']`.

### What's next

After integration, you can customize WProofreader further:

* [Configuration reference](https://webspellchecker.com/docs/api/wscbundle/Options.html) for the full list of options (default language, UI localization, check types, custom dictionaries, and more).
* [Features](/v6.10.0.0/features/spell-and-grammar-check) overview to explore custom dictionaries, style guide rules, AI writing assistant, and other capabilities.
* [Demos](https://demos.webspellchecker.com/) to see working examples with Froala and other editors.
* [Froala's WProofreader example](https://froala.com/wysiwyg-editor/examples/web-spell-checker/) on the Froala website.

### FAQ

#### Does Froala have a dedicated WProofreader plugin?

No. Unlike TinyMCE and CKEditor 5, Froala doesn't have a dedicated WProofreader plugin with a toolbar button. WProofreader integrates with Froala through the script-based or NPM SDK methods and provides its own floating UI for suggestions.

#### What's the difference between WProofreader and Froala's built-in spell checker?

Froala's native spell checker plugin offers basic spelling check only. WProofreader adds grammar, style, and punctuation checking, spelling autocorrect, text autocomplete, automatic language detection, and custom dictionaries.

#### Why does the init() example check for this.$iframe?

Froala can render content either inside an iframe or directly in the page element. When `iframe: true` is set, WProofreader needs to attach to the iframe element. The ternary expression (`this.$iframe ? this.$iframe[0] : this.el`) handles both modes automatically.


# TinyMCE 6+

This guide covers how to add WProofreader spelling, grammar, and style checking to TinyMCE. It applies to both Cloud and self-hosted deployments.

The dedicated plugin with toolbar button and native theme is available for TinyMCE 6+. Script-based and NPM SDK methods work with any TinyMCE version.

### Prerequisites

You'll need an active WProofreader subscription or trial. [Sign up for a free trial or choose a plan →](https://wproofreader.com/sdk#pricing)

For the Cloud version, you'll need a Service ID. You can find it on the [Credentials](https://app.wproofreader.com/credentials) page in the admin panel after signing up. For self-hosted, you'll need the endpoint of your WProofreader application (protocol, host, port, and path) to specify in the configuration parameters.

### Choose your integration method

There are three ways to integrate WProofreader with TinyMCE. Pick the one that fits your setup.

| Method                                        | Best for                                                                                                                 | TinyMCE versions | Toolbar button and theme |
| --------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ | ---------------- | ------------------------ |
| Dedicated plugin (recommended for TinyMCE 6+) | Projects that want a native TinyMCE experience with a toolbar icon and matching theme.                                   | 6+               | Yes                      |
| Script-based                                  | Quick setup without a build process. Works with any TinyMCE version.                                                     | Any              | No                       |
| NPM SDK                                       | JavaScript framework projects (React, Angular, Vue) or setups with multiple editors sharing one proofreading dependency. | Any              | No                       |

### Dedicated plugin

The dedicated plugin adds a **WProofreader** button to the TinyMCE toolbar and applies a theme that matches the editor's look and feel. Available as an [npm package →](https://www.npmjs.com/package/@webspellchecker/wproofreader-tinymce).

[See live demo →](https://demos.webspellchecker.com/wproofreader-tinymce.html)

#### Install using CDN

Use `external_plugins` to load the plugin directly from a CDN. No installation or build tools needed.

{% code overflow="wrap" %}

```html
<script src="https://cdn.tiny.cloud/1/no-api-key/tinymce/8/tinymce.min.js" referrerpolicy="origin"></script>

<textarea id="editor">Your text here.</textarea>

<script>
  tinymce.init({
    selector: '#editor',
    external_plugins: {
      wproofreader: 'https://cdn.jsdelivr.net/npm/@webspellchecker/wproofreader-tinymce@1.0.0/dist/plugin.min.js'
    },
    toolbar: 'undo redo | bold italic | wproofreader',
    wproofreader: {
      serviceId: 'your-service-ID',
      srcUrl: 'https://svc.webspellchecker.net/spellcheck31/wscbundle/wscbundle.js'
    }
  });
</script>
```

{% endcode %}

For self-hosted deployments, replace the `wproofreader` config:

```js
wproofreader: {
  serviceProtocol: 'https',
  serviceHost: 'your_host_name',
  servicePort: '443',
  servicePath: 'wscservice/api',
  srcUrl: 'https://your_host_name/wscservice/wscbundle/wscbundle.js'
}
```

#### Install using npm

1. Install the package:

```bash
npm install @webspellchecker/wproofreader-tinymce
```

2. Make the plugin's `dist/plugin.min.js` accessible via your web server or build tool.
3. Reference the plugin with `external_plugins`:

```html
<script>
  tinymce.init({
    selector: '#editor',
    external_plugins: {
      wproofreader: '/path/to/@webspellchecker/wproofreader-tinymce/dist/plugin.min.js'
    },
    toolbar: 'undo redo | bold italic | wproofreader',
    wproofreader: {
      serviceId: 'your-service-ID',
      srcUrl: 'https://svc.webspellchecker.net/spellcheck31/wscbundle/wscbundle.js'
    }
  });
</script>
```

Alternatively, copy the plugin's `dist` folder into TinyMCE's `plugins` directory, rename it to `wproofreader`, and use `plugins` instead of `external_plugins`:

```js
tinymce.init({
  selector: '#editor',
  plugins: 'wproofreader',
  toolbar: 'undo redo | bold italic | wproofreader',
  wproofreader: {
    serviceId: 'your-service-ID',
    srcUrl: 'https://svc.webspellchecker.net/spellcheck31/wscbundle/wscbundle.js'
  }
});
```

#### ES module import

For ES6/bundler projects, import the plugin directly:

```js
import tinymce from 'tinymce';
import 'tinymce/themes/silver/theme.min.js';
import 'tinymce/models/dom/model.min.js';
import 'tinymce/skins/ui/oxide/skin.js';
// ... other TinyMCE imports

import '@webspellchecker/wproofreader-tinymce/src/plugin.js';

tinymce.init({
  selector: '#editor',
  plugins: 'wproofreader',
  toolbar: 'undo redo | bold italic | wproofreader',
  wproofreader: {
    serviceId: 'your-service-ID',
    srcUrl: 'https://svc.webspellchecker.net/spellcheck31/wscbundle/wscbundle.js'
  }
});
```

### Script-based integration

This method uses the WProofreader script to enable proofreading in TinyMCE. It doesn't require the dedicated plugin and works with any TinyMCE version.

The simplest approach is `autoSearch`, which detects TinyMCE's editable area automatically when a user focuses on it. For setup instructions, refer to the [Initialize using autoSearch →](/v6.10.0.0/integrations/initialization/initialization-options#initialize-using-autosearch) guide.

#### Using init() for immediate activation

If you want proofreading to start on editor load without waiting for focus, use `init()` inside TinyMCE's `init_instance_callback`:

```html
<script>
  window.WEBSPELLCHECKER_CONFIG = {
    autoSearch: true,
    autoDestroy: true,
    serviceId: 'your-service-ID'
  };
</script>

<script src="https://svc.webspellchecker.net/spellcheck31/wscbundle/wscbundle.js"></script>

<textarea id="editor">Your text here.</textarea>

<script>
  tinymce.init({
    selector: '#editor',
    init_instance_callback: function(editor) {
      WEBSPELLCHECKER.init({
        container: editor.iframeElement
      });
    }
  });
</script>
```

Setting `autoSearch: true` and `autoDestroy: true` alongside `init()` ensures WProofreader recovers correctly when TinyMCE switches between editing modes (for example, toggling WYSIWYG and source view).

### NPM SDK integration

The WProofreader SDK npm package is a universal integration method that works with any editor, including TinyMCE. It's a good fit for JavaScript framework projects (React, Angular, Vue) or when you use multiple editors and want a single proofreading dependency.

For setup instructions, refer to the [Initialize using npm SDK →](/v6.10.0.0/integrations/initialization/initialization-options/initialize-using-npm-sdk) guide. It covers installation, configuration, and usage with `autoSearch` and `init()`.

### Remove other spell checkers

If you've been using other spell check tools (including TinyMCE's built-in spell checker), remove or disable them to avoid conflicts.

### What's next

After integration, you can customize WProofreader further:

* [Configuration reference →](https://webspellchecker.com/docs/api/wscbundle/Options.html) for the full list of options (default language, UI localization, check types, custom dictionaries, and more).
* [Organization dictionary →](/v6.10.0.0/features/custom-dictionary/organization-dictionary) to set up shared wordlists for your team.
* [Demos →](https://demos.webspellchecker.com/) to see working examples with TinyMCE and other editors.

### FAQ

#### Which TinyMCE versions are supported?

The dedicated plugin works with TinyMCE 6 and later, including TinyMCE 7 and 8. Script-based and NPM SDK integration methods work with any TinyMCE version.

#### How is this different from TinyMCE's built-in spell checker?

TinyMCE's built-in spell checker covers spelling only. WProofreader adds grammar, style, and punctuation checking, spelling autocorrect, text autocomplete, automatic language detection, and custom dictionaries.

#### Can I use the Cloud and self-hosted versions interchangeably?

Yes. The integration code is the same. The only difference is the connection parameters: `serviceId` for the Cloud version, and server connection parameters (`serviceProtocol`, `serviceHost`, `servicePort`, `servicePath`) plus the `srcUrl` for self-hosted.

#### Why don't my changes appear immediately after integration?

WProofreader needs a moment to load and initialize. If you're using `autoSearch`, proofreading starts when the editor receives focus. If you need it immediately on page load, use the `init()` method.


# HTML editable elements

This guide covers how to enable WProofreader in standard HTML editable elements: `<textarea>`, `<div contenteditable>`, `<iframe>`, and `<input>`. It applies to both Cloud and self-hosted deployments.

For rich text editors like TinyMCE, CKEditor, or Froala, refer to the dedicated editor integration guides.

[See HTML controls demo](https://demos.webspellchecker.com/wproofreader-html-controls.html) | [See mixed controls demo](https://demos.webspellchecker.com/wproofreader-mixed-controls.html)

### Prerequisites

You'll need an active WProofreader subscription or trial. [Sign up for a free trial or choose a plan](https://wproofreader.com/sdk#pricing)

For the Cloud version, you'll need a Service ID. You can find it on the [Credentials](https://app.wproofreader.com/credentials) page in the admin panel after signing up. For self-hosted, you'll need the endpoint of your WProofreader application (protocol, host, port, and path) to specify in the configuration parameters.

### Supported elements

WProofreader works with the following HTML elements:

| Element                 | Notes                                                                                               |
| ----------------------- | --------------------------------------------------------------------------------------------------- |
| `<textarea>`            | Supported by default with autoSearch.                                                               |
| `<div contenteditable>` | Supported by default with autoSearch.                                                               |
| `<iframe>`              | The iframe document must have `contenteditable` set on the `<body>` or a child element.             |
| `<input>`               | Disabled by default with autoSearch. Requires `enableAutoSearchIn: ['input']` or explicit `init()`. |

### Using autoSearch

The simplest approach. Add the WProofreader config and script to your page. WProofreader will activate automatically when a user focuses on any supported editable element.

For setup instructions, refer to the [Initialize using autoSearch](/v6.10.0.0/integrations/initialization/initialization-options) guide.

### Using init()

Use `init()` when you want proofreading to start immediately on a specific element without waiting for focus.

#### Textarea

```html
<textarea id="my-textarea">Your text here.</textarea>

<script>
  var instance = WEBSPELLCHECKER.init({
    container: document.getElementById('my-textarea')
  });
</script>
```

#### Contenteditable div

```html
<div contenteditable id="my-div">
  <p>Your text here.</p>
</div>

<script>
  var instance = WEBSPELLCHECKER.init({
    container: document.getElementById('my-div')
  });
</script>
```

#### Iframe

The iframe must contain an editable document. Point the `container` to the iframe element itself.

```html
<iframe id="my-iframe" src="editable-page.html"></iframe>

<script>
  var instance = WEBSPELLCHECKER.init({
    container: document.getElementById('my-iframe')
  });
</script>
```

The `editable-page.html` file should have `contenteditable` on the `<body>`:

```html
<html>
<body contenteditable>
  Your text here.
</body>
</html>
```

#### Input

`<input>` elements aren't covered by autoSearch by default. Use `init()` to enable proofreading on a specific input:

```html
<input id="my-input" type="text" value="Your text here.">

<script>
  var instance = WEBSPELLCHECKER.init({
    container: document.getElementById('my-input')
  });
</script>
```

To enable autoSearch for all `<input>` elements on the page, add `enableAutoSearchIn: ['input']` to your config.

### Using data-wsc-autocreate

You can also mark elements with `data-wsc-autocreate="true"` to initialize WProofreader automatically on page load without requiring focus. Element-level attributes can override global config settings.

html

```html
<script>
  window.WEBSPELLCHECKER_CONFIG = {
    serviceId: 'your-service-ID'
  };
</script>

<div contenteditable data-wsc-autocreate="true">
  <p>Your text here.</p>
</div>

<textarea data-wsc-autocreate="true" data-wsc-lang="es_ES">
  Your text here.
</textarea>

<script src="https://svc.webspellchecker.net/spellcheck31/wscbundle/wscbundle.js"></script>
```

For details on this and other initialization methods, refer to the Initialization options guide.

### Multiple elements on one page

You can initialize WProofreader on multiple elements. Define the config once and call `init()` for each element:

```html
<script>
  window.WEBSPELLCHECKER_CONFIG = {
    serviceId: 'your-service-ID'
  };
</script>

<div contenteditable id="editor1"><p>First editor.</p></div>
<textarea id="editor2">Second editor.</textarea>

<script>
  var instance1 = WEBSPELLCHECKER.init({
    container: document.getElementById('editor1')
  });

  var instance2 = WEBSPELLCHECKER.init({
    container: document.getElementById('editor2')
  });
</script>

<script src="https://svc.webspellchecker.net/spellcheck31/wscbundle/wscbundle.js"></script>
```

Alternatively, use `autoSearch: true` in the config and WProofreader will handle all editable elements automatically as they receive focus.

### NPM SDK integration

The WProofreader SDK npm package is a universal integration method that works with any HTML element. It's a good fit for JavaScript framework projects (React, Angular, Vue).

For setup instructions, refer to the [Initialize using npm SDK](/v6.10.0.0/integrations/initialization/initialization-options/initialize-using-npm-sdk) guide.

### What's next

* [Configuration options](https://docs.wproofreader.com/integrations/initialization/configuration-options) to customize behavior, UI, languages, and dictionaries.
* [Configuration reference](https://webspellchecker.com/docs/api/wscbundle/Options.html) for the full list of parameters.
* [Features](/v6.10.0.0/features/spell-and-grammar-check) overview to explore all WProofreader capabilities.
* [Demos](https://demos.webspellchecker.com/) to see working examples.


# Legacy SCAYT


# SCAYT plugin for CKEditor 4

This guide outlines the main steps that you need to follow in order to integrate and configure the SCAYT plugin for [CKEditor 4](https://ckeditor.com/ckeditor-4/). All the described steps are provided for the Server version of SCAYT.

### 1. Initialize CKEditor 4 <a href="#scaytpluginforckeditor4-1.initializeckeditor4" id="scaytpluginforckeditor4-1.initializeckeditor4"></a>

Before integrating and configuring the SCAYT plugin, CKEditor 4 should be properly configured in your web application. If you haven't done it yet, please [download the latest version of the CKEditor 4 standard package](https://ckeditor.com/ckeditor-4/download/) and refer to [CKEditor Quick Start Guide](https://ckeditor.com/docs/ckeditor4/latest/guide/dev_installation.html).

### 2. Activate SCAYT plugin <a href="#scaytpluginforckeditor4-2.activatescaytplugin" id="scaytpluginforckeditor4-2.activatescaytplugin"></a>

If you are using the standard package of CKEditor 4, the SCAYT plugin is already there, which is pointed to the free services. To accomplish migration to the trial or paid version of SCAYT, the additional SCAYT parameters must be added to the CKEditor **config.js** file.

To activate the Cloud version of the SCAYT plugin, you must add the **scayt\_customerId** option to the CKEditor **config.js** file.

```
config.scayt_customerId = 'service_activation_key';
```

Meanwhile to activate the on-premise version of the SCAYT plugin you have to specify the **server parameters** and appropriate path to the **wscbundle.js** file on your server where spelling and grammar check requests will be processed.

```javascript
config.scayt_serviceProtocol='http(s)';
config.scayt_serviceHost='your_host_name';
config.scayt_servicePort ='443';
config.scayt_servicePath ='virtual_directory/api'; // by default the virtual_directory is wscservice
config.scayt_srcUrl ="http(s)://your_host_name/virtual_directory/wscbundle/wscbundle.js";
```

### 3. Adjust default settings <a href="#scaytpluginforckeditor4-3.adjustdefaultsettings" id="scaytpluginforckeditor4-3.adjustdefaultsettings"></a>

Define additional SCAYT parameters, for example, start SCAYT spelling and grammar automatically, change default language, and others. For details, refer to [SCAYT parameters for CKEditor 4](/v6.10.0.0/integrations/legacy-scayt/scayt-parameters-for-ckeditor-4) guide.

```javascript
config.scayt_autoStartup = true; // enable spell check as you type on the editor load
config.grayt_autoStartup = true; // enable grammar check
config.scayt_sLang ='auto'; // sets the default language
```

#### Can be also useful: <a href="#scaytpluginforckeditor4-canbealsouseful" id="scaytpluginforckeditor4-canbealsouseful"></a>

* [SCAYT parameters for CKEditor 4](/v6.10.0.0/integrations/legacy-scayt/scayt-parameters-for-ckeditor-4)

<br>


# SCAYT parameters for CKEditor 4

Here you can find a list of all available SCAYT parameters for CKEditor 4.0+ that can be used for the SCAYT configuration. For more details, refer to [CKEDITOR configuration documentation](https://docs.ckeditor.com/ckeditor4/latest/api/CKEDITOR_config.html).

<details>

<summary><strong>scayt_autoStartup</strong> (boolean)</summary>

Turns SCAYT on/off automatically after the editor loads.

Values: `true`, `false`

Default: `true`

Example:

```javascript
config.scayt_autoStartup = true;
```

</details>

<details>

<summary><strong>grayt_autoStartup (boolean)</strong></summary>

Automatically turns Grammar As You Type (GRAYT) on/off once SCAYT has started.

Values: `true`, `false`

Default: `true`

Example:

```javascript
config.grayt_autoStartup = false;
```

</details>

### grayt\_autoStartup <a href="#scaytparametersforckeditor4-grayt_autostartup" id="scaytparametersforckeditor4-grayt_autostartup"></a>

| Description:     | **grayt\_autoStartup** parameter turns Grammar As You Type (GRAYT) on/off automatically once SCAYT has started. |
| ---------------- | --------------------------------------------------------------------------------------------------------------- |
| Parameter type:  | Boolean                                                                                                         |
| Default value:   | true                                                                                                            |
| Possible values: | <ul><li>true</li><li>false</li></ul>                                                                            |

Example:

```javascript
config.grayt_autoStartup = false;
```

### scayt\_inlineModeImmediateMarkup <a href="#scaytparametersforckeditor4-scayt_inlinemodeimmediatemarkup" id="scaytparametersforckeditor4-scayt_inlinemodeimmediatemarkup"></a>

| Description:     | **scayt\_inlineModeImmediateMarkup** parameter turns the SCAYT initiation on/off when Inline CKEditor is not focused. The SCAYT markup is taken place (SCAYT instance is not destroyed) in both Inline CKEditor's states, focused and unfocused. |
| ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Parameter type:  | Boolean                                                                                                                                                                                                                                          |
| Default value:   | false                                                                                                                                                                                                                                            |
| Possible values: | <ul><li>true</li><li>false</li></ul>                                                                                                                                                                                                             |

Example:

```javascript
config.scayt_inlineModeImmediateMarkup = true;
```

### scayt\_maxSuggestions <a href="#scaytparametersforckeditor4-scayt_maxsuggestions" id="scaytparametersforckeditor4-scayt_maxsuggestions"></a>

| Description:     | **scayt\_maxSuggestions** parameter defines the number of SCAYT suggestions to show in the main context menu.                                                                                                                                                                                                           |
| ---------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Parameter type:  | Number                                                                                                                                                                                                                                                                                                                  |
| Default value:   | 3                                                                                                                                                                                                                                                                                                                       |
| Possible values: | <ul><li>0 (zero) – No suggestions are shown in the main context menu. All suggestions will be shown in the “More Suggestions” sub-menu.</li><li>positive number – The max number of suggestions to show in the main context menu. Other entries will be listed in “More Suggestions”.</li><li>negative number</li></ul> |

Example:

```javascript
config.scayt_maxSuggestions = 3;
```

### scayt\_minWordLength <a href="#scaytparametersforckeditor4-scayt_minwordlength" id="scaytparametersforckeditor4-scayt_minwordlength"></a>

| Description:     | **scayt\_minWordLength** parameter defines the minimum length of the words that will be collected from editor's text for spell checking. |
| ---------------- | ---------------------------------------------------------------------------------------------------------------------------------------- |
| Parameter type:  | Number                                                                                                                                   |
| Default value:   | 3                                                                                                                                        |
| Possible values: | any positive number                                                                                                                      |

Example:

```javascript
config.scayt_minWordLength = 2;
```

### scayt\_customerId <a href="#scaytparametersforckeditor4-scayt_customerid" id="scaytparametersforckeditor4-scayt_customerid"></a>

| Description:     | <p><strong>scayt\_customerId</strong> parameter sets a customer ID for Cloud SCAYT. It is required for migration from free, ad-supported version to paid, ad-free version.</p><p><strong>scayt\_customerId</strong> is intended for use only with the <strong>Cloud version of SCAYT.</strong></p> |
| ---------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Parameter type:  | String                                                                                                                                                                                                                                                                                             |
| Default value:   | The free version of SCAYT plugin is shipped with already predefined service ID value.                                                                                                                                                                                                              |
| Possible values: | your-service-id                                                                                                                                                                                                                                                                                    |

Example:

```javascript
config.scayt_customerId = 'your-service-id';
```

### scayt\_ignoreAllCapsWords <a href="#scaytparametersforckeditor4-scayt_ignoreallcapswords" id="scaytparametersforckeditor4-scayt_ignoreallcapswords"></a>

| Description:     | **scayt\_ignoreAllCapsWords** parameter regulates whether all capitalized words should be ignored. |
| ---------------- | -------------------------------------------------------------------------------------------------- |
| Parameter type:  | Boolean                                                                                            |
| Default value:   | false                                                                                              |
| Possible values: | <ul><li>true</li><li>false</li></ul>                                                               |

Example:

```javascript
config.scayt_ignoreAllCapsWords = true;
```

### scayt\_ignoreDomainNames <a href="#scaytparametersforckeditor4-scayt_ignoredomainnames" id="scaytparametersforckeditor4-scayt_ignoredomainnames"></a>

| Description:     | **scayt\_ignoreDomainNames** parameter regulates whether domain names and web addresses should be ignored. |
| ---------------- | ---------------------------------------------------------------------------------------------------------- |
| Parameter type:  | Boolean                                                                                                    |
| Default value:   | false                                                                                                      |
| Possible values: | <ul><li>true</li><li>false</li></ul>                                                                       |

Example:

```javascript
config.scayt_ignoreDomainNames = true;
```

### scayt\_ignoreWordsWithMixedCases <a href="#scaytparametersforckeditor4-scayt_ignorewordswithmixedcases" id="scaytparametersforckeditor4-scayt_ignorewordswithmixedcases"></a>

| Description:     | **scayt\_ignoreWordsWithMixedCases** parameter regulates whether words with mixed case letters should be ignored. |
| ---------------- | ----------------------------------------------------------------------------------------------------------------- |
| Parameter type:  | Boolean                                                                                                           |
| Default value:   | false                                                                                                             |
| Possible values: | <ul><li>true</li><li>false</li></ul>                                                                              |

Example:

```javascript
config.scayt_ignoreWordsWithMixedCases = true;
```

### scayt\_ignoreWordsWithNumbers <a href="#scaytparametersforckeditor4-scayt_ignorewordswithnumbers" id="scaytparametersforckeditor4-scayt_ignorewordswithnumbers"></a>

| Description:     | **scayt\_ignoreWordsWithNumbers** parameter regulates whether words containing numbers should be ignored. |
| ---------------- | --------------------------------------------------------------------------------------------------------- |
| Parameter type:  | Boolean                                                                                                   |
| Default value:   | false                                                                                                     |
| Possible values: | <ul><li>true</li><li>false</li></ul>                                                                      |

Example:

```javascript
config.scayt_ignoreWordsWithNumbers = true;
```

### scayt\_disableOptionsStorage <a href="#scaytparametersforckeditor4-scayt_disableoptionsstorage" id="scaytparametersforckeditor4-scayt_disableoptionsstorage"></a>

| Description:     | **scayt\_disableOptionsStorage** parameter defines whether SCAYT options storing should be disabled. It is allowed to pass an array of options.                                      |
| ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Parameter type:  | Array                                                                                                                                                                                |
| Default value:   | ' '                                                                                                                                                                                  |
| Possible values: | <ul><li>' '</li><li>scayt\_ignoreAllCapsWords</li><li>scayt\_ignoreDomainNames</li><li>scayt\_ignoreWordsWithMixedCases</li><li>scayt\_ignoreWordsWithNumbers</li><li>lang</li></ul> |

Example:

```javascript
config.scayt_disableOptionsStorage = ['lang', 'ignore-all-caps-words', 'ignore-words-with-mixed-cases']];
```

### scayt\_moreSuggestions <a href="#scaytparametersforckeditor4-scayt_moresuggestions" id="scaytparametersforckeditor4-scayt_moresuggestions"></a>

| Description:     | **scayt\_moreSuggestions** parameter enables/disables the “More Suggestions” sub-menu in the context menu. |
| ---------------- | ---------------------------------------------------------------------------------------------------------- |
| Parameter type:  | String                                                                                                     |
| Default value:   | on                                                                                                         |
| Possible values: | on, off                                                                                                    |

Example:

```javascript
config.scayt_moreSuggestions = 'off';
```

### scayt\_contextCommands <a href="#scaytparametersforckeditor4-scayt_contextcommands" id="scaytparametersforckeditor4-scayt_contextcommands"></a>

| Description:     | <p><strong>scayt\_contextCommands</strong> parameter manages and customizes the SCAYT context menu commands: Add Word, Ignore All, Options, Languages, Dictionaries and About. It is allowed to pass more than one value separating each value with a vertical bar.</p><p>Options, Languages and Dictionaries items can be added to the SCAYT context menu only if these items are present on the SCAYT settings dialog. The visibility of these items are regulated by the <a href="#scaytparametersforckeditor4-scayt_uitabsscayt_uitabs">scayt\_uiTabs</a> parameter.</p> |
| ---------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Parameter type:  | Array                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| Default value:   | ignore\|ignoreall\|add                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| Possible values: | <ul><li>ignoreall</li></ul>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |

Example:

```javascript
//Show only the Add Word and Ignore All commands in the context menu.
config.scayt_contextCommands = 'add|ignoreall';
```

### scayt\_sLang <a href="#scaytparametersforckeditor4-scayt_slang" id="scaytparametersforckeditor4-scayt_slang"></a>

| Description:     | **scayt\_sLang** parameter sets a language short code of the default language that will be used for spell checking. |
| ---------------- | ------------------------------------------------------------------------------------------------------------------- |
| Parameter type:  | String                                                                                                              |
| Default value:   | en\_US (American English)                                                                                           |
| Possible values: | <ul><li><a href="/pages/GUZ6cksYHij4R1JW5Nhz">Supported languages</a></li></ul>                                     |

Example:

```javascript
//Set the default language to German (de_DE).
config.scayt_sLang = 'de_DE';
```

### scayt\_uiTabs <a href="#scaytparametersforckeditor4-scayt_uitabsscayt_uitabs" id="scaytparametersforckeditor4-scayt_uitabsscayt_uitabs"></a>

| Description:     | <p><strong>scayt\_uiTabs</strong> parameter customizes the SCAYT settings dialog and manages visibility of particular tabs there such as Options, Languages, and Dictionaries.</p><p>By default, SCAYT settings dialog contains four tabs, namely <strong>Options</strong>, <strong>Languages</strong>, <strong>Dictionaries</strong>, and <strong>About</strong>. The <strong>About</strong> tab is used to provide the information about the SCAYT version and copyrights. Unlike <strong>Options</strong>, <strong>Languages</strong>, <strong>Dictionaries</strong> tabs, it can't be removed.</p> |
| ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Parameter type:  | Array                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| Default value:   | 1,1,1                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| Possible values: | <ul><li>0,0,0 – Hide all customizable tabs: <strong>Options</strong>, <strong>Languages</strong>, and <strong>Dictionaries</strong>.</li><li>0,1,0 – Hide the <strong>Options</strong> and <strong>Dictionaries</strong> tabs.</li><li>0,0,1 – Hide the <strong>Options</strong> and <strong>Languages</strong> tabs.</li><li>1,1,0 – Hide the <strong>Dictionaries</strong> tab.</li><li>1,0,1 – Hide the <strong>Language</strong> tab.</li><li>1,1,1 – Show all tabs: <strong>Options</strong>, <strong>Languages</strong>, and <strong>Dictionaries</strong>.</li></ul>                            |

Example:

```javascript
//Hide the Languages tab.
config.scayt_uiTabs = '1,0,1';
```

### scayt\_serviceProtocol <a href="#scaytparametersforckeditor4-scayt_serviceprotocol" id="scaytparametersforckeditor4-scayt_serviceprotocol"></a>

| Description:     | <p><strong>scayt\_serviceProtocol</strong> parameter specifies a protocol to access the SCAYT service. If this parameter is not specified, the protocol will be automatically defined based on the script location.</p><p>This is the parameter that intended for us with the <strong>Server version</strong> only.</p> |
| ---------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Parameter type:  | String                                                                                                                                                                                                                                                                                                                  |
| Default value:   | https                                                                                                                                                                                                                                                                                                                   |
| Possible values: | <ul><li>http</li><li>https</li></ul>                                                                                                                                                                                                                                                                                    |

Example:

```javascript
config.scayt_serviceProtocol='https';
```

### scayt\_serviceHost <a href="#scaytparametersforckeditor4-scayt_servicehost" id="scaytparametersforckeditor4-scayt_servicehost"></a>

| Description:     | <p><strong>scayt\_serviceHost</strong> parameter specifies a service host name to access the SCAYT service. If this parameter is not specified clearly, the service host will be automatically defined based on the script location.</p><p>The SCAYT plugin which is shipped with the default CKEditor packages is pointed to the WebSpellChecker Cloud services. <strong>scayt\_serviceHost</strong> is already predefined in the plugin configuration.</p><p>If you are using the <strong>Server version</strong>, you need to specify the <strong>host name</strong> that you used during the installation of WebSpellChecker.</p> |
| ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Parameter type:  | String                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
| Default value:   | [svc.webspellchecker.net](http://svc.webspellchecker.net/)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| Possible values: | <ul><li><a href="http://svc.webspellchecker.net/">svc.webspellchecker.net</a> – The default WebSpellChecker service host name. It is used for the WebSpellChecker Cloud services subscriptions.</li><li>your\_host\_name</li></ul>                                                                                                                                                                                                                                                                                                                                                                                                    |

Example:

```javascript
config.scayt_serviceHost='your_host_name';
```

### scayt\_servicePort <a href="#scaytparametersforckeditor4-scayt_serviceport" id="scaytparametersforckeditor4-scayt_serviceport"></a>

| Description:     | <p><strong>scayt\_servicePort</strong> parameter specifies a service port that will be used to access the SCAYT service.</p><p>This is the parameter that intended for us with the <strong>Server version</strong> only.</p> |
| ---------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Parameter type:  | String                                                                                                                                                                                                                       |
| Default value:   | 80                                                                                                                                                                                                                           |
| Possible values: | <p>Any available port.</p><ul><li>2880 – default port that listens WebSpellChecker AppServer. Use this port if your are using the Server version.</li></ul>                                                                  |

Example:

```javascript
config.scayt_servicePort ='2880';
```

### scayt\_servicePath <a href="#scaytparametersforckeditor4-scayt_servicepath" id="scaytparametersforckeditor4-scayt_servicepath"></a>

| Description:     | **scayt\_servicePath** parameter specifies a path that will be used to access the SCAYT service.                                                                                                                                                                                                                                                                                                                                                                                        |
| ---------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Parameter type:  | String                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| Default value:   | /virtual\_directory/script/ssrv.fcgi                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| Possible values: | <ul><li>Path to the <strong>ssrv.fcgi</strong> script. Use this if you are using the older versions of WebSpellChecker v4.x and the connection between your app and AppServer is confogured via FastCGI protocol (using SSRV.cgi component).</li><li>Use '<strong>/</strong>' if you are using the newer versions of WebSpellChecker v5.x. and you configured the direct connetion with AppServer. In this case also use <strong>config.scayt\_servicePort ='2880';.</strong></li></ul> |

Example:

```javascript
config.scayt_servicePath ='virtual_directory/script/ssrv.fcgi';
```

Or

```javascript
config.scayt_servicePath ='/';
```

### scayt\_srcUrl <a href="#scaytparametersforckeditor4-scayt_srcurl" id="scaytparametersforckeditor4-scayt_srcurl"></a>

| Description:     | <p><strong>scayt\_srcUrl</strong> parameter specifies a URL to the SCAYT core.</p><p><strong>scayt\_srcUrl</strong> is intended for use only with the Server version of SCAYT.</p> |
| ---------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Parameter type:  | String                                                                                                                                                                             |
| Default value:   | http(s)://your\_host\_name/virtual\_directory/wscbundle/wscbundle.js                                                                                                               |
| Possible values: | <ul><li>http(s)://your\_host\_name/virtual\_directory/wscbundle/wscbundle.js</li><li>http(s)://your\_host\_name/virtual\_directory/lf/scayt3/ckscayt/ckscayt.js</li></ul>          |

Example:

```javascript
config.scayt_srcUrl ='http(s)://your_host_name/virtual_directory/wscbundle/wscbundle.js"';
```

### scayt\_customDictionaryIds <a href="#scaytparametersforckeditor4-scayt_customdictionaryids" id="scaytparametersforckeditor4-scayt_customdictionaryids"></a>

| Description:     | **scayt\_customDictionaryIds** parameter specifies a custom dictionary ID that will be linked with SCAYT. |
| ---------------- | --------------------------------------------------------------------------------------------------------- |
| Parameter type:  | String                                                                                                    |
| Default value:   | None                                                                                                      |
| Possible values: | IDs of custom dictionaries.                                                                               |

Example:

```javascript
config.scayt_customDictionaryIds='3021,3456,3478';
```

### scayt\_userDictionaryName <a href="#scaytparametersforckeditor4-scayt_userdictionaryname" id="scaytparametersforckeditor4-scayt_userdictionaryname"></a>

| Description:     | **scayt\_userDictionaryName** parameter predefines a specific user dictionary that will be used with SCAYT. |
| ---------------- | ----------------------------------------------------------------------------------------------------------- |
| Parameter type:  | String                                                                                                      |
| Default value:   | None                                                                                                        |
| Possible values: | Any name of a user dictionary.                                                                              |

Example:

```javascript
config.scayt_userDictionaryName='user_dictionary_name';
```

### scayt\_contextMenuItemsOrder <a href="#scaytparametersforckeditor4-scayt_contextmenuitemsorder" id="scaytparametersforckeditor4-scayt_contextmenuitemsorder"></a>

| Description:     | **scayt\_contextMenuItemsOrder** parameter defines the order of SCAYT context menu items by groups. This must be a string with one or more of the following words separated by a pipe character ('\|'). |
| ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Parameter type:  | String                                                                                                                                                                                                  |
| Default value:   | suggest\|moresuggest\|control                                                                                                                                                                           |
| Possible values: | <ul><li>suggest – main suggestion word list;</li><li>moresuggest – more suggestions word list;</li><li>control – SCAYT commands, such as “Ignore” and “Add Word”.</li></ul>                             |

Example:

```javascript
config.scayt_contextMenuItemsOrder = 'moresuggest|control|suggest';
```

### scayt\_elementsToIgnore <a href="#scaytparametersforckeditor4-scayt_elementstoignore" id="scaytparametersforckeditor4-scayt_elementstoignore"></a>

| Description:     | **scayt\_elementsToIgnore** parameter defines HTML tags that will be ignored during check spelling. |
| ---------------- | --------------------------------------------------------------------------------------------------- |
| Parameter type:  | String                                                                                              |
| Default value:   | 'style'                                                                                             |
| Possible values: | Any HTML tag                                                                                        |

Example:

```javascript
config.scayt_elementsToIgnore='del,pre'';
```

### scayt\_multiLanguageMode <a href="#scaytparametersforckeditor4-scayt_multilanguagemodescayt_multilanguagemodetruereddeprecated-or-wsc5" id="scaytparametersforckeditor4-scayt_multilanguagemodescayt_multilanguagemodetruereddeprecated-or-wsc5"></a>

{% hint style="warning" %}
DEPRECATED | WSC 5.3.2
{% endhint %}

| Description:     | <p><strong>scayt\_multiLanguageMode</strong> parameter turns on/off a special multi-language support mode.</p><p>scayt\_multiLanguageMode parameter was specifically designed to work with a certain language plugin for CKEditor. Before using this parameter, CKEditor <a href="https://ckeditor.com/cke4/addon/language">Language</a> plugin must be added.</p> |
| ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Parameter type:  | Boolean                                                                                                                                                                                                                                                                                                                                                            |
| Default value:   | false                                                                                                                                                                                                                                                                                                                                                              |
| Possible values: | <ul><li>true – multi-language support turns on after the editor loading.</li><li>false</li></ul>                                                                                                                                                                                                                                                                   |

Example:

```javascript
config.scayt_multiLanguageMode='true';
```

### scayt\_multiLanguageStyles <a href="#scaytparametersforckeditor4-scayt_multilanguagestylestruereddeprecated-or-wsc5.3.2" id="scaytparametersforckeditor4-scayt_multilanguagestylestruereddeprecated-or-wsc5.3.2"></a>

{% hint style="warning" %}
DEPRECATED | WSC 5.3.2
{% endhint %}

| Description:     | <p><strong>scayt\_multiLanguageStyles</strong> parameter allows defining additional styles for misspelled words specific for a particular language.</p><p>scayt\_multiLanguageStyles can be used only if the <a href="#scaytparametersforckeditor4-scayt_multilanguagemodescayt_multilanguagemodetruereddeprecated-or-wsc5.">scayt\_multiLanguageMode</a> parameter is set to “true”.</p>                         |
| ---------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Parameter type:  | Object                                                                                                                                                                                                                                                                                                                                                                                                            |
| Default value:   | None                                                                                                                                                                                                                                                                                                                                                                                                              |
| Possible values: | <p>{<br>'Language\_short\_code': 'background-image: none; color: #cc22cc',<br>'el': 'background-image: none; color: blue',<br>'nl': 'background-image: none; color: red',<br>'fi': 'background-image: none; color: indigo',<br>'fr': 'background-image: none; color: orange',<br>'de': 'background-image: none; color: green'<br>};</p><p>All short codes should be presented according ISO 639-1:2002 codes.</p> |

Example:

```javascript
config.scayt_multiLanguageStyles= {'fr': 'color: green'};
```

<br>


# Drupal

WProofreader spelling and grammar checker is available in Drupal through two CKEditor 5 modules developed by CKSource:

* [**CKEditor 5 Premium Features**](https://www.drupal.org/project/ckeditor5_premium_features) — Includes the paid version of WProofreader SDK (cloud or self-hosted). Requires a license and provides full control over configuration and functionality.

{% hint style="info" %}
You don't need a separate license for other premium features in the module to use WProofreader.
{% endhint %}

* [**CKEditor 5 Plugin Pack**](https://www.drupal.org/project/ckeditor5_plugin_pack) — Includes the free version of WProofreader, enabled by default. No sign-up or activation key is required. This version has word processing limits, limited functionality, and no advanced settings management.

Both modules point to the WebSpellChecker cloud service by default (governed by the [Terms of Service](https://webspellchecker.com/legal/terms-of-service/)). The CKEditor 5 Plugin Pack doesn't allow changing this, while the CKEditor 5 Premium Features module lets you choose between cloud and self-hosted deployment. For a detailed comparison of free and paid versions, see [Free vs paid](https://www.drupal.org/docs/extending-drupal/contributed-modules/contributed-module-documentation/ckeditor-5-plugin-pack/wproofreader-free-vs-premium-feature-comparison).

{% hint style="info" %}
One of the above Drupal modules must be installed on your Drupal website before using WProofreader.
{% endhint %}

### Getting started

WProofreader is enabled by default for the main editor and comments that use CKEditor 5 under the hood. It isn't activated for plain text fields or standard inputs.

To obtain a license for WProofreader SDK, [sign up for one of the paid plans](https://wproofreader.com/sdk#pricing) (which differ by the word package included) or [contact us](https://wproofreader.com/contact-us) for Enterprise pricing with self-hosted deployment.

#### Activating WProofreader

WProofreader in [CKEditor 5 Premium Features](https://www.drupal.org/project/ckeditor5_premium_features) for Drupal uses the cloud service by default and requires a service ID as an activation key.

1. Navigate to **Administration > Configuration > CKEditor 5 Premium Features > WProofreader**.
2. Enter your **Service ID** in the corresponding field. You can find this on the [Credentials](https://app.wproofreader.com/credentials) page in the WProofreader admin panel.

<figure><img src="/files/2p7AwohG2Lhhwj7HoPXT" alt=""><figcaption></figcaption></figure>

3. Click **Save configuration**.

Once a valid activation key is saved, proofreading will be active in all rich text fields using the default settings.

### Settings overview

There's a list of settings available to adjust the default behavior of the proofreading tool:

* **Language.** Change the default language for proofreading.
* **Custom dictionary.** Manage organization-level dictionaries.
* **General check types.** Enable which types of suggestions (spelling, grammar and style) and functionality (spelling autocorrect and text autocomplete) should be enabled.
* **Spelling ignore options.** Define if the spellchecker should skip certain types of words during check, such as words written in mixed letters, etc.
* **Advanced features.** Enable advanced proofreading and text rewriting functionality with AI writing assistant.
* **Advanced settings.** Custom configuration options and deployment option.

The following settings are available to customize WProofreader behavior.

#### Language

The default language is set to **Autodetect**. In this mode, WProofreader will try to automatically detect the language of the input text.

{% hint style="info" %}
At least 2–3 correct words are needed for language detection. Only one language is used per sentence. If multiple languages are detected, the one with the higher probability will be used for checking.
{% endhint %}

The language dropdown displays the languages selected during sign-up. You can also modify the available languages from the Settings page in the admin panel. See [How to change the list of languages](/v6.10.0.0/faq/technical/languages/how-to-change-the-list-of-languages).

#### Custom dictionary

Custom dictionaries are managed at the organization or global level by subscription or application admins. For the cloud version, they're managed from the admin panel under [Custom dictionary](https://app.wproofreader.com/custom-dictionary).

* If the dictionary ID field is left empty, all enabled dictionaries will be applied.
* If one or more dictionary IDs are specified, only those dictionaries will be loaded for your Drupal site.

#### User default settings

These settings control which check types and features are enabled by default. They're also accessible to end users in the WProofreader UI. Admins can set defaults, but users can override them. User preferences are saved in the browser's local storage until it's cleared. You can restrict user modifications through permissions.

<figure><img src="/files/LXvdVL8t2kWlnVu2BFxO" alt=""><figcaption></figcaption></figure>

Available check types:

* **Spelling suggestions**
* **Grammar suggestions**
* **Style guide suggestions** — Based on custom rules created in the WProofreader admin panel (shown as <mark style="background-color:yellow;">yellow underlines</mark>). Also includes predefined rules for inclusive language and profanity/offensive language detection. Check out more about [Style suggestions](broken://pages/Oo376uOy7ZJvBhaypPIY) and [Style guide builder](/v6.10.0.0/features/old-style-guide-builder).
* **Correct spelling automatically** (autocorrect)
* **Autocomplete suggestions** (text prediction) — Currently available for English only.

{% hint style="info" %}
Not all check types are supported for every language.
{% endhint %}

#### Spelling ignore options

These options apply only to spelling suggestions (red underlines) and are also saved in browser local storage if changed by a user.

<figure><img src="/files/xvDwZKB9Zcia9INzR2rS" alt=""><figcaption></figcaption></figure>

#### Advanced features

This section currently contains a single setting: the **AI writing assistant (AIWA)**, which is disabled by default. When enabled, AIWA offers predefined text operations such as rewrite, improve, summarize, and more. Learn more about [AIWA](/v6.10.0.0/features/ai-writing-assistant-aiwa).

<figure><img src="/files/n0LfGroiBsGnBn22u82r" alt=""><figcaption></figcaption></figure>

#### Advanced settings

This section contains two main options: one for adding custom configuration options to adjust default settings that aren't available on the UI, and another to update the WProofreader service endpoint and connect to the self-hosted version instead of the cloud service.

<figure><img src="/files/fSfjCEpWkiy4zTQKf9gj" alt=""><figcaption></figcaption></figure>

**Custom configuration**

Allows you to specify additional WProofreader configuration options that aren't available through the Drupal settings UI. Options must be provided in JSON format.

<figure><img src="/files/UehZUTGUnrjDORXu14Of" alt=""><figcaption></figcaption></figure>

**Example:**

{% code title="json" %}

```json
{"theme": "dark", "allSuggestionsMode": true, "fullSizeBadge": true}
```

{% endcode %}

These options override values set elsewhere in the configuration form. See the full [Configuration reference](https://webspellchecker.com/docs/api/wscbundle/Options.html) for available options.

**Deployment options**

Controls the WProofreader service endpoint. By default, WProofreader uses the cloud service.

<figure><img src="/files/67nWenRJIDOlYUl9T886" alt=""><figcaption></figcaption></figure>

If you have a license for the self-hosted version, select **Use self-hosted version endpoint** and fill in the following fields:

* **Protocol** (e.g., `https`)
* **Hostname** (e.g., `domain.com`)
* **Port** (e.g., `443`)
* **Service path** (e.g., `wscservice/api`)
* **WProofreader script URL** (e.g., `https://host_name/virtual_directory/wscbundle/wscbundle.js`)

The resulting endpoint URL should look like: `https://domain.com/wscservice/api`

Once you've configured the endpoint, click **Save configuration** to apply changes.

{% hint style="info" %}
When using a self-hosted endpoint, you don't need to specify a Service ID. It's only required for the cloud service.
{% endhint %}

<div align="left"><figure><img src="/files/DuPtDPISU2OjG40Er0xO" alt="" width="375"><figcaption></figcaption></figure></div>

### User guide

When editing content in any CKEditor 5 field in Drupal, you'll see two UI elements indicating WProofreader is active:

* An **“A“ icon** on the editor toolbar
* An **orange badge (dot)** in the bottom-right corner of the editable field

Both elements open a menu with additional actions: **Proofread in dialog**, **Settings**, and **Disable/Enable**.

<figure><img src="/files/CCdO9CFDJurd7sOnK6uN" alt=""><figcaption></figcaption></figure>

For a complete guide on using WProofreader as an end user, see the [User manual](/v6.10.0.0/user-manuals/user-manual).

{% hint style="info" %}
You can try a [live demo of WProofreader in CKEditor 5](https://demos.webspellchecker.com/wproofreader-ckeditor5.html) to see it in action.
{% endhint %}


# WordPress

WProofreader is available as a dedicated plugin for WordPress. It works in the WordPress admin area and checks spelling, grammar, punctuation, and style in editable fields such as post and page editors.

For installation instructions and FAQs, see the [WProofreader plugin page on WordPress.org](https://wordpress.org/plugins/webspellchecker/).

For a quick walkthrough, watch the [user guide video](https://www.youtube.com/watch?v=mhrZN87jydA).

### Free vs Pro

The free version of the plugin is enabled by default when the plugin is installed. It comes with a daily usage limit and limited functionality.

The Pro version removes daily limits, unlocks grammar checking for supported languages, and adds features like text autocomplete, organization dictionaries, and a style guide builder. To learn more, refer to the [WProofreader for WordPress plans page →](https://wproofreader.com/integrations/wordpress#plans).

### Configuring the plugin

After installing the plugin, go to the WordPress Administration console and select **Settings** > **WProofreader**.

<figure><img src="/files/1eajbsMP4AC5h82zGD45" alt="WProofreader settings page showing License Key, Default Language, and content type checkboxes"><figcaption></figcaption></figure>

#### Upgrading to Pro

To activate the Pro version, paste your license key into the **License Key** field and click **Save Changes**. You can get a license key by starting a free trial on the [WProofreader plans page](https://wproofreader.com/integrations/wordpress#plans) or by contacting the sales team.

#### Selecting the default language

Select the default language for spell check from the **Default Language** dropdown and click **Save Changes**. The dropdown is set to **Autodetect** by default in the Pro version.

<div align="left"><figure><img src="/files/0LSMih8OU3QR4Nu1CSFZ" alt="Default Language dropdown expanded showing available languages" width="563"><figcaption></figcaption></figure></div>

#### Enabling or disabling proofreading for content types

You can control which WordPress content types the plugin checks. Select or clear the checkboxes for the content types you want to enable or disable, then click **Save Changes**: Check Posts, Check Pages, Check Products, Check Categories, and Check Tags.

#### Enabling WProofreader in the admin area

Select the **Enable in admin area** checkbox to run WProofreader across all editable fields in the WordPress admin panel. Click **Save Changes** to apply.

<figure><img src="/files/on32OzOdUuNj0TJh5kwA" alt="Enable in admin area checkbox selected"><figcaption></figcaption></figure>

#### Enabling WProofreader on the public site

Select the **Enable on public site** checkbox to run WProofreader in editable fields on the public site, such as contact forms and forums. Click **Save Changes** to apply.

<figure><img src="/files/81FHBd6yunOnNmpmyZMn" alt="Enable on public site checkbox selected"><figcaption></figcaption></figure>

### Supported content elements

The plugin proofreads content in editing mode for the following elements: pages, posts, tag descriptions, category descriptions, WooCommerce and WP eCommerce product descriptions, any custom post types, and Meta description fields of the Yoast SEO plugin. With the **Enable in admin area** option turned on, all editable fields across the WordPress admin are also covered.

### FAQ

#### Does the plugin check the entire website at once?

No. The plugin only checks content that is in editing mode. It doesn't scan the full website at once.

#### Is Elementor supported?

No, the plugin doesn't currently support the Elementor editor.

#### Are Disqus comment fields supported with the public site option?

No, Disqus fields aren't supported when using the **Enable on public site** option.


# How-tos


# Custom insertText event

Here is an example of using **customInsertText** event for managing the insert text mechanism flexibly.

```javascript
var container = document.querySelector('.container'); // Get the main editable container.

container.addEventListener('customInsertText', function(event) {
    // Call 'preventDefault' to prevent WProofreader from replacing text.
    // After that the text replacent mechanism can be handled manually.
    event.preventDefault();

    // Obtain text for replacing from 'detail' field of the 'event' object.
    var text = event.detail.text;

    // Get the selection for the text insertion.
    // The text that is to be replaced are already in the browser Selection.
    var selection = window.getSelection();

    // Keep the error highlighting if needed.
    event.keepHighlight = true;
});

```


# Disabling WProofreader in source mode of WYSIWYG editors

Quite often we receive requests from our clients asking how to disable the proofreading option in the source mode of a rich text editor and keep it enabled only in the WYSIWYG mode. In general, for such cases, we offer a special option **disableAutoSearchIn** of WProofreader that allows disabling it for certain cases (class, id, data attribute name and HTML elements).

**Disabling WProofreader in Source Mode of CKEditor 4**

<mark style="background-color:green;">\[Resolved]</mark>

The source mode of CKEditor 4 has a special CSS class '**.cke\_source**'. You can rely on this class and disable WProofreader using the **disableAutoSearchIn** option with this class specified as in the example below.

```javascript
<script>
	window.WEBSPELLCHECKER_CONFIG = {
   		....
   		disableAutoSearchIn: ['.cke_source']
  		....
	};
</script>
```

{% hint style="warning" %}
WProofreader was disabled by default for CKEditor 4 source mode in release [5.5.2](https://webspellchecker.com/release-notes/webspellchecker-cloud-server-5-5-2-release-note/) effective date August 16, 2019.
{% endhint %}


# How to add on-click listener to the badge?

If you need to capture an onclick event, when your end-users click on the WProofreader badge button, you can do the following:

```javascript
var buttons = document.querySelectorAll('.wsc-badge__button');

buttons.forEach(function(button) {
    button.addEventListener('click', function(e) {
        // Do what you want here on badge button click event.
    });
});
```


# How to customize the look and feel of WProofreader?

Besides using the already available **default** and **gray** themes, with the release v5.5.8 (March 26, 2020) we added an option for our customers to create a **custom** theme for WProofreader. You will be able to overwrite the default styles and adjust the look and feel of WProofreader to the style of your product.

1\. Add **theme** option to the config and specify **custom** as a value.

```javascript
<script>
    window.WEBSPELLCHECKER_CONFIG = {
        ...
        theme: 'custom',
        ...
    }
</script>
```

2\. Create you custom CSS styles to overwrite the default theme of WProofreader.

```javascript
<style>
    .wsc-theme-custom .wsc-badge__label-button {
        background-color: blue !important;
    }
</style>
```

#### Examples of current styles for main UI elements <a href="#howtocustomizethelookandfeelofwproofreader-examplesofcurrentstylesformainuielements" id="howtocustomizethelookandfeelofwproofreader-examplesofcurrentstylesformainuielements"></a>

Below are examples of current CSS styles for UI elements that you might want to overwrite with your custom styles.

**Spinner inside badge**

```javascript
.wsc-badge--checking .wsc-badge__label-button {
    ...
    background-image: url(svg/spinner.svg) !important;
    ...
}
```

**Underlines for spelling and grammar type suggestions**

```javascript
.wsc-spelling-problem {
    ...
    border-bottom: 2px solid rgba(234,28,35,.65)!important;
    ...
}

.wsc-grammar-problem {
    ...
    border-bottom: 2px solid rgba(0,98,231,.65)!important;
    ...
}
```

**Hovered state of spelling and grammar type suggestions**

```javascript
.wsc-spelling-problem.wsc-problem-text--active {
    background-color: rgba(234,28,35,.15);
}

.wsc-grammar-problem.wsc-problem-text--active {
    background-color: rgba(0,98,231,.15);
}
```


# How to destroy WProofreader and clean all its resources in full page view of source mode in CKEditor

CKEditor 4 is a WYSIWYG editor, so it makes it easy for end users to work on HTML content without any knowledge of HTML whatsoever. More advanced users, however, sometimes want to access raw HTML source code for their content and CKEditor 4 makes it possible by providing two dedicated plugins: Source Editing Area and Source Dialog.

CKEditor 4 offers a separate plugin called [Full Page Mode](https://ckeditor.com/docs/ckeditor4/latest/features/fullpage.html) that allows with its help to edit entire HTML pages (from \<html> to \</html>), including the page metadata like DOCTYPE, character set encoding, meta tags, text and background color, or margins. Check demo [here](https://ckeditor.com/docs/ckeditor4/latest/features/sourcearea.html).

If WProofreader is added on the page, it will be enabled in this full page mode as well. As a result you might notice various scrips/files (e.g. wsc.css) of WProofreader that are visible in the source mode. In certain cases, such injections might be a problem and the right solution will be to disable WProofreader when switching to the source mode from the WYSIWYG mode and strip our all the entries of the WProofreader resources. There is cross-browser workaround proposed to overcome the above described issue (see below).

1\. Define the config script as on the example below. On this step we will save the link to WProofreader instance for further use.

```javascript
window.WEBSPELLCHECKER_CONFIG = {
    ...
    onLoad: function(instance) {
        var container = instance.getContainerNode(), // Link to the editable container
            isCkeditor4 = container.classList.contains('cke_editable'); // Uncommon check for CKEditor 4

        if (isCkeditor4) {
            container.savedWscInstance = instance; // Save link on the WProofreader instance to the editable DOM element
        }
    },
    ...
};
```

2\. After that, you need to destroy the previously saved instance of the WProofreader before a user switches to the source mode of CKEditor and remove the link on the CSS styles from the editable iframe element.

```javascript
// Subscribe to the CKEditor 4 'instanceReady' event
CKEDITOR.on('instanceReady', function(event) {
    var editor = event.editor;

    // Subscribe to the CKEditor 4 'beforeSetMode' event
    editor.on('beforeSetMode', function(e) {
        // If a user switches from the WYSIWYG mode to the source mode of CKEditor 4
        if (e.data === 'source') {
            var container = editor.editable().$,
                parent = container.parentNode,
                links = parent.getElementsByTagName('link'),
                styleName = 'wsc.css',
                link;

            if (!container.savedWscInstance) {
                return;
            }

            // Destroy the WProofreader instance and remove the link to it
            container.savedWscInstance.destroy();
            container.savedWscInstance = null;

            // Go through all links and remove link to the wsc.css style file
            for (var i = 0; i < links.length; i++) {
                link = links[i];

                if (link.href.indexOf(styleName) !== -1 && link.parentNode) {
                    link.parentNode.removeChild(link);
                }
            }
        }
    });
});
```

If you have any troubles implementing this workaround, please feel free to[ submit your support request](https://webspellchecker.com/contact-us/).


# How to disable the 'Proofread in dialog' mode

There are two modes that WProofreader provides for text proofreading: as you type in the editable area and in a separate dialog. The dialog aggregates all suggestions from a text field or all text fields on the page. User can quickly navigate through all suggestions in dialog using keyboard navigation or icons/buttons on user interface (see screenshots below).

If you preference is to keep only as you type mode, you can disable the dialog mode by adding the **actionItems** option to config script as follows (remove '**proofreadDialog**' value):

```javascript
actionItems: ['addWord', 'ignoreAll', 'settings', 'toggle']
```

If you preference is to keep only as you type mode, you can disable the dialog mode by adding the **disableDialog** option with `true`to config script:

```javascript
disableDialog: true,
```


# How to initialize WProofreader in several text fields with different languages?

There is an option to start WProofreader in different text fields with different predefined settings, like a language. It can be archived with the **setLang** method.

1\. Initialize WProofreader using the **init() method** if you clearly know in which field you want to initialize WProofreader which provides additional management options.

2\. Specify the appropriate language **shortcode** in the **setLang** in **WEBSPELLCHECKER.init.** For example, using it in combination with the [**getInstances()**](https://webspellchecker.com/docs/api/wscbundle/WEBSPELLCHECKER.html#.getInstances) method.

```javascript
WEBSPELLCHECKER.getInstances()[0].setLang('NEW_LANGUAGE_CODE')
```

3\. Also, it's recommended to disable synchronizing of languages between all the created WProofreader instances. It's enabled by default. To disable it using **syncOptions** in **WEBSPELLCHECKER\_CONFIG** as shown below. Please note that this option also handles synchronization of the spell check ignore options.

```javascript
syncOptions: false,
```

4\. If needed, disable storing of the user-selected language between browser sessions using **disableOptionsStorage** in **WEBSPELLCHECKER\_CONFIG**.

If it's not done, the user-selected language will be saved in the browser local storage until it's cleared and the predefined options will be of no effect.

```javascript
disableOptionsStorage: [lang],
```


# How to subscribe to addWordToUserDictionary and deleteWordFromUserDictionary action

There are separate callback functions available such as **onAddWordToUserDictionary** and **onDeleteWordFromUserDictionary**, that you can use to get information about newly added or removed words from the personal user dictionaries.

```javascript
</script>
window.WEBSPELLCHECKER_CONFIG = {
    ...
    onAddWordToUserDictionary: function(word, instance) {
        console.log(word);
    },
    onDeleteWordFromUserDictionary: function(word, instance) {
        console.log(word);
    }
};
</script>
```

For the versions of the package before release 5.5.8, there is a temporary workaround available if you need to listen to Add or remove word actions performed by end users.

```javascript
<script>
window.WEBSPELLCHECKER_CONFIG = {
    autoSearch: true,
    ....,
    onLoad: function(instance) {
        instance.subscribe('addWordToUserDictionary', function(data) {
            // Get the added `word` from `data.word` field
        });

        instance.subscribe('deleteWordFromUserDictionary', function(data) {
            // Get the deleted `word` from `data.word` field
        });
    }
};
</script>
```


# Replace action is not captured in CKEditor onChange event

#### Description of the use case <a href="#replaceactionisnotcapturedinckeditoronchangeevent-descriptionoftheusecase" id="replaceactionisnotcapturedinckeditoronchangeevent-descriptionoftheusecase"></a>

Right at this moment, when a user clicks on the suggestion, our editor needs to know (programatically) that something has changed in the original text. Unfortunately, these events are NOT captured in the onChange event of the CKEditor editor.

#### Solution <a href="#replaceactionisnotcapturedinckeditoronchangeevent-solution" id="replaceactionisnotcapturedinckeditoronchangeevent-solution"></a>

To track the changes in the original text programmatically, you can use the **data.action** attribute. Here is an example:

```javascript
window.WEBSPELLCHECKER_CONFIG = {
    ...
    onStatistics: function(data, instance) {
        if (data.action !== 'replace') {
            return;
        }
        // React somehow on the `replace` action inside the editable field.
    },
    ...
}
```

Check [Configuration reference](https://webspellchecker.com/docs/api/wscbundle/Options.html) to see all the available WProofreader configuration options and methods.


# Use recommendations with other writing assistance tools

More and more end users nowadays are relying on the various digital writing assistants when it comes to the polishing and validating the writing. The most popular among them is Grammarly.

Thus, when integrating a spelling/grammar checking functionality, you may face with the dilemma how to act if your end users might also use other tools for proofreading the texts. Having both integrated spelling/grammar checking and external tool will lead to conflicts and cause certain inconvenience or confusion for end users (duplicated underlines, pop-ups and other elements).

There are list of possible options how you can act in case of other external tools for proofreading are enabled by end users.

### Option A. A setting to enable/disable integrated spelling/grammar checking <a href="#userecommendationswithotherdigitalassistancetools-optiona.asettingtoenable-disableintegratedspelling" id="userecommendationswithotherdigitalassistancetools-optiona.asettingtoenable-disableintegratedspelling"></a>

Since you have a full control of your web app and manage the authorization of users, you can add a setting for a user to be able to disable the spelling/grammar checking functionality integrated in your app. In this case, if a user prefers using an external tool, they can disable the functionality offered by your product. And depending on the user choice, you can then either load WProofreader on the page or not.

Below is a screenshot from Gmail settings. They allow a user to disable the default grammar and spelling suggestions.

<figure><img src="/files/5tUphMryrf651xxMhlmH" alt=""><figcaption></figcaption></figure>

### Option B. Monitor if an external tool is enabled and do not start WProofreader <a href="#userecommendationswithotherdigitalassistancetools-optionb.monitorifanexternaltoolisenabledanddonotst" id="userecommendationswithotherdigitalassistancetools-optionb.monitorifanexternaltoolisenabledanddonotst"></a>

There is another option possible. You can implement a script that would monitor if any external proofreading solution (e.g. Grammarly) is added to the browser of a user. And if so, do not start WProofreader on the page. This approach is complex and tricky. There are dozens of external tools that can be used, thus, you would need to monitor all possible that will be used by your end users and have it implemented for various browsers.

### Option C. Disable badge and keep only problems underlines <a href="#userecommendationswithotherdigitalassistancetools-optionc.disablebadgeandkeeponlyproblemsunderlines" id="userecommendationswithotherdigitalassistancetools-optionc.disablebadgeandkeeponlyproblemsunderlines"></a>

If you believe that having duplicated underlines for found problems is not a problem and the only thing that irritates is a badge (a bubble at the right corner of the editable section), you can disable it for all users. WProofreader comes with the plenty of options that allows configuring behaviour and user interface based on your needs. One of such an option is to disable the badge element and keep only underlines. All the actions like disable/enable will be available in the suggestion pop-up which appears on hover on an underlined problem. Check the instructions in the [WProofreader customization options](https://docs.wproofreader.com/v6.10.0.0/integrations/how-tos/pages/0OnbFOd5JpEZ4SHSMjjy#wproofreadercustomizationoptions-2.3.wproofreaderbadge) guide.


# Versioning with jsDelivr

Even though it is highly recommended to always use the latest version of WProofreader package (wscbundle.js), there might be exceptions to this rule.

Rarely we can introduce drastic changes to the user interface or overall user experience. Thus, it might require extra time for existing customers to adapt to changes.

In the initialization of WProofreader, you are required to specify the path to **wscbundle.js** script. Its default and recommended path is below.

Path to the latest version:

```javascript
<script type="text/javascript" src="https://svc.webspellchecker.net/spellcheck31/wscbundle/wscbundle.js"></script>
```

An example of a specific version of **wscbunle.js** using [jsDelivr](https://www.jsdelivr.com/) CDN.

```javascript
<script src='https://cdn.jsdelivr.net/gh/WebSpellChecker/wproofreader@5.7.1.1/wscbundle/wscbundle.js'></script>
```

Select the required release tag from the open [WProofreader repository](https://github.com/WebSpellChecker/wproofreader/tags). The scope of changes in each release will be available on the [public changelog](https://github.com/WebSpellChecker/wproofreader/blob/master/CHANGELOG.md).

2\. Make sure you have the additional service endpoint (serviceProtocol, serviceHost, servicePort, servicePath) [parameters](https://webspellchecker.com/docs/api/wscbundle/Options.html) explicitly specified in the configuration script as shown below.

```javascript
...
serviceProtocol:'http',
serviceHost:'svc.webspellchecker.net',
servicePort:'443',
servicePath:'spellcheck31/api'
...
```

Otherwise, you might receive an error like this:

{% hint style="warning" %}
“CORS response parsing error: SyntaxError: Unexpected token 'M', "Method Not Allowed" is not valid JSON”.
{% endhint %}


# User manual

[WProofreader SDK](https://webspellchecker.com/wsc-proofreader/) is a 2-in-1 solution that combines spell & grammar check in the as-you-type and proofread in dialog modes and can be conveniently integrated into any HTML editable tag or modern WYSIWYG editor. Check out the list of all [supported integrations](/v6.10.0.0/integrations/supported-integrations).

WProofreader is compliant with the [Web Content Accessibility Guidelines (WCAG)](https://www.w3.org/TR/WCAG20/) and [Section 508](https://www.section508.gov/content/learn/laws-and-policies) and comes along with the keyboard navigation. Users with limited abilities can proofread, switch between the modes, tweak WProofreader settings, and complete other tasks using keyboard shortcuts only. Read more in the [Keyboard navigation](/v6.10.0.0/user-manuals/keyboard-navigation) guide.

This is a user manual on how to check spelling, grammar, and punctuation with the WProofreader add-on for rich text editors (RTEs) and tweak its settings. This guide is for WProofreader users and developers integrating WProofreader into their clients’ infrastructure.

### **1. Entering text in the input fields** <a href="#draft-usermanualforv3.x.x-1.enteringtextintheinputfields" id="draft-usermanualforv3.x.x-1.enteringtextintheinputfields"></a>

WProofreader is active in the editable HTML element or WYSIWYG (what you see is what you get) editor when you see the badge in the bottom right corner of the text field and words underlined with red, blue and yellow lines. This red badge on hover displays the total number of writing issues in the active element found.

To see the WProofreader suggestions card, hover on a marked word or phrase.

Grammar and punctuation suggestions based on classical engines reference a particular rule, spelling suggestions – on dictionaries and the Levenshtein distance while a selection of suggestions. For grammar-type recommendations, there’s a description in the suggestions card, which is duplicated in the Proofread in dialog mode.

For language dialects that use AI-based English, German and Spanish under the hood, suggestions come without explanation.

<figure><img src="/files/1y99aF6vNcIBx1ziHlRz" alt=""><figcaption></figcaption></figure>

While users are checking the text, the badge is displaying the progress circle. Once proofreading is finished, the badge displays the number of writing issues found. Also, the badge will change the color from orange to red in case of appearing some mistakes.

In case of a spelling error, only one word is highlighted. If there are grammar issues or incorrect sentence structure, a whole phrase or even a sentence can be highlighted.

Words written with the hyphen and foreign words are highlighted as a phrase.

<figure><img src="/files/HHDymRogn86sj9IPWTcB" alt=""><figcaption></figcaption></figure>

### **2. Accepting/rejecting suggestions in the as-you-type mode** <a href="#draft-usermanualforv3.x.x-2.accepting-rejectingwproofreadersuggestionsintheas-you-typemode" id="draft-usermanualforv3.x.x-2.accepting-rejectingwproofreadersuggestionsintheas-you-typemode"></a>

Actions users can take in the suggestions pop-up for writing issues:

* *Accept the suggestion*. Users can select a word/phrase from the list of available suggestions in the pop-up and replace the original highlighted word/phrase.

<figure><img src="/files/HHDymRogn86sj9IPWTcB" alt=""><figcaption></figcaption></figure>

* *Ignore all.* By enabling this option, users allow WProofreader to ignore all entries of a spelling issue for a certain word/phrase in the active text fragment during the current browser session.

<figure><img src="/files/oALSfdn5yUB1o8iwM8AH" alt=""><figcaption></figcaption></figure>

* *Add word.* Available only for spelling issues. Users can add a word to a dictionary, so WProofreader will no longer consider it as a misspelled one.

<figure><img src="/files/s29cO0dPbdEWBOKBxHAR" alt=""><figcaption></figcaption></figure>

### **3. Reporting suggestions in the as-you-type mode** <a href="#draft-usermanualforv3.x.x-3.proofreadindialogmode" id="draft-usermanualforv3.x.x-3.proofreadindialogmode"></a>

Users can report incorrect or irrelevant suggestions in the suggestion pop-up. The navigation will differ depending on the suggestion type. All reported cases are reviewed by the linguistic team and corrected if they are confirmed to be incorrect. Reports for languages with higher customer usage are reviewed once a month, while reports for languages with lower customer usage may be reviewed less frequently.

* *Report incorrect* for spelling suggestions. Users can navigate to the suggestion pop-up, click the three dots (**More options**), and select **Report incorrect**. After that, the issue is reported, and the word is no longer underlined as a misspelled one during the current browser session. Once the browser tab or browser is closed, the word is underlined again. However, the reported issue has already been submitted and will be reviewed.

{% embed url="<https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F6QiVwqs2cZLwmoBb72dC%2Fuploads%2FOZ94zXrmmDALChn516mY%2Fspelling_suggestions_report.mp4?alt=media&token=e5e5a821-cabc-49ce-b287-f9348ed74efb>" %}

* *Report incorrect* for grammar and style suggestion. Users need to navigate through a suggestion pop-up and click on the flag sign **Report incorrect** in the bottom-right corner. After that, the issue is reported, and the word/phrase is no longer underlined as a mistake during the current browser session. Once the browser tab or browser is closed, the word is underlined again. However, the reported issue has already been submitted and will be reviewed.

{% embed url="<https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F6QiVwqs2cZLwmoBb72dC%2Fuploads%2Fy3z0OUYGGeBTK71BZ82M%2Fgrammar_suggestions_report.mp4?alt=media&token=b0cbb92c-a6a1-4dde-a3d1-56f77162fe7b>" %}

### **4. Proofread in dialog mode** <a href="#draft-usermanualforv3.x.x-3.proofreadindialogmode" id="draft-usermanualforv3.x.x-3.proofreadindialogmode"></a>

Users can proofread the text in a separate dialog. The mode is enabled when the user hovers the badge and clicks on the **Proofread in dialog** icon in the Settings dialog.

Proofread in dialog mode is floating, you can drag and drop it to any place on the page, and it duplicates the options of the as-you-type mode. For spelling issues, there are suggestions the user can accept, ignore or add to flagged word to the personal dictionary. For grammar issues, there are suggestions the user can accept or ignore.

When the user enables **Ignore all** option, the total number of issues found and shown in the badge reduces.

Users can navigate with a mouse cursor and keyboard shortcuts through the suggestions in Proofread in dialog mode.

### **5. Tweaking settings** <a href="#draft-usermanualforv3.x.x-4.tweakingwproofreadersettings" id="draft-usermanualforv3.x.x-4.tweakingwproofreadersettings"></a>

You can modify WProofreader settings (spelling ignore options, languages, general) and manage personal dictionaries in the Settings dialog. There are two ways to access it:

* navigate to **Settings** in the WProofreader badge in the bottom right corner;
* open Proofread in dialog mode and click the burger button in the top left corner to open WProofreader settings.

### 6. Spelling ignore options <a href="#draft-usermanualforv3.x.x-5.spellingignoreoptions" id="draft-usermanualforv3.x.x-5.spellingignoreoptions"></a>

Users can:

* ignore all-caps words (for example, “WSC”);
* ignore domain names (for example, “support@[webspellchecker.net](http://webspellchecker.net)”);
* ignore words with mixed cases (for example, “WebSpellChecker”);
* ignore words with numbers (for example, “2nd”).

Note that enabled/disabled options are remembered and kept in the browser's local storage until it’s cleaned (unless the developer configured not to store user-selected options in the browser storage). Valid only for the current proofreading session. Once the local storage is cleaned, all options are reset to default ones.

### 7. Languages <a href="#draft-usermanualforv3.x.x-6.languages" id="draft-usermanualforv3.x.x-6.languages"></a>

WProofreader provides spell and grammar checking for [80+ languages](/v6.10.0.0/features/supported-languages). The number of languages depends on the license configuration. The default language list can be [extended](broken://pages/5dWbZbJhERL3JFFONXPf) with other languages by the admin or license manager if required.

Also, there is the **language autodetect** feature enabled that allows users to proofread mixed texts. It’s set as a default language option unless another language is predefined by a developer.

WProofreader auto-detector automatically identifies the language of the text and checks spelling, grammar, and punctuation according to its rules. It's important to note that for its proper work, users need to type at least two-three correct words.

### **8. Creating user-level custom dictionaries** <a href="#draft-usermanualforv3.x.x-7.creatingusercustomdictionaries" id="draft-usermanualforv3.x.x-7.creatingusercustomdictionaries"></a>

Users can create dictionaries in WProofreader settings.

User custom dictionaries are individual vocabularies of words that are not recognized by WProofreader. All the words added to a dictionary stop be considered as misspellings and may be included in the suggestions list.

Click **Go to Dictionary** in the Settings dialog, enter a dictionary name and click **Create.**

To connect an existing dictionary with a list of previously added words, enter a dictionary name and click **Connect.**

Actions users can take with dictionaries:

* *Rename.* Users can change a dictionary name. Go to dictionary settings, select **Rename**. Enter a new name and click **Rename**. To keep the existing name, click **Cancel**.
* *Add a word.* Users can add new words to dictionaries from the suggestion pop-up, Proofread in dialog mode and the Settings dialog.
  * To add a new word from the Settings dialog, enter a new word in the text field and click **Add**.
  * To add a new word from the suggestions pop-up, hover on a marked word and click **Add word.**
  * To add a new word from Proofread in dialog mode, click **Add word**.
* *Disconnect.* Users can disconnect an existing dictionary by clicking **Disconnect** in dictionary settings.
* *Delete.* Users can delete a dictionary with all the words by clicking **Delete**. All words from the selected dictionary will be deleted permanently.

Note, user dictionaries are generic and words in different languages will be added to one dictionary.

By default, all the words added to a dictionary are stored in the browser local storage on the user laptop.

When a user creates a new dictionary, all the new words and the words from a browser local storage are added to this dictionary and stored on the remote server.

If the dictionary is created, users can access the contents of their dictionary from different browsers, machines or devices when working with WProofreader.

In case a user doesn’t have a dictionary and all the words are stored, for instance, in Chrome local storage, he/she can access their words only in Chrome browser.

* **About**

WProofreader version and copyright info are presented in the **About** tab. You may find it useful when providing information about your system to our support team.


# Keyboard navigation

WProofreader add-on for rich text editors is a all-in-1 solution that combines spell & grammar check in several proofreading modes and can be conveniently integrated in any HTML editable control or modern rich text editor (RTE).

WProofreader is compliant with the [Web Content Accessibility Guidelines (WCAG)](https://www.w3.org/TR/WCAG20/) and [Section 508](https://www.section508.gov/content/learn/laws-and-policies) and comes along with keyboard navigation. Users with limited abilities can proofread, switch between the modes, tweak settings and complete other tasks using keyboard shortcuts only.

This guide is for WProofreader users and developers integrating WProofreader into their clients’ infrastructure. Check the below keyboard commands to use WProofreader.

### Prerequisites <a href="#draft-keyboardnavigationforv3.x.x-prerequisites" id="draft-keyboardnavigationforv3.x.x-prerequisites"></a>

| Version          | VERSION 3.0.0+ |
| ---------------- | -------------- |
| Theme            | Standard       |
| Rich text editor | CKEditor 4     |
| Language         | English        |

### Proofreading in the as-you-type mode <a href="#draft-keyboardnavigationforv3.x.x-proofreadingintheasyoutypemode" id="draft-keyboardnavigationforv3.x.x-proofreadingintheasyoutypemode"></a>

WProofreader checks users’ texts in editable HTML elements and rich text editors for spelling, grammar, and punctuation errors while the user is typing. The red badge in the bottom right corner of the text box displays the total number of grammar, spelling and punctuation issues found in the active element. If there are no issues, you can see the tick sign on the orange badge.

### Accessing more features <a href="#draft-keyboardnavigationforv3.x.x-accessingmorefeatures" id="draft-keyboardnavigationforv3.x.x-accessingmorefeatures"></a>

Users can access more WProofreader features through the badge, in particular:

* switch to proofread in-dialog mode
* tweak spelling ignore options
* create and manage dictionaries
* set the language for proofreading.

Press **`Tab`** to navigate to the badge. You’ll see a badge highlighted with a circle around it. Then press **`Enter`** or **`Space`** to open the badge and switch to the proofread-in-dialog mode, the Settings dialog, toggle Proofreader options.

On MacOS laptops, only **`Space`** can be used to open the list of languages. However, this depends a lot on the system preferences.

Keyboard commands to access more WProofreader options:

| Keyboard command            | Description                                                                                                                         |
| --------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
| `←` and `→` arrow key       | Move between items                                                                                                                  |
| `Enter` / `Space`           | <ul><li>Disable / enable WProofreader</li><li>Activate the Settings dialog</li><li>Switch to the proofread-in-dialog mode</li></ul> |
| <p><code>Esc</code><br></p> | Close WProofreader menu                                                                                                             |

Check the video below to use keyboard navigation to access all the capabilities of the WProofreader user interface.

### Proofread-in-dialog mode <a href="#draft-keyboardnavigationforv3.x.x-proofreadindialogmode" id="draft-keyboardnavigationforv3.x.x-proofreadindialogmode"></a>

To switch to the proofread-in-dialog mode from the as-you-type mode, press **`Tab`** to highlight the badge. Then press **`Enter`** or **`Space`** to display the badge actions. Use the **`Left`** / **`Right`** arrow key to navigate to the **Proofread-in-dialog** icon and press **`Enter`** or **`Space`** .

With the commands below, users can accept/ignore WProofreader suggestions, and add words to a dictionary.

| Keyboard command           | Description                                                                                                                                                                          |
| -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `Left` / `Right` arrow key | Move between grammar and spelling issues found. The selected issue is highlighted.                                                                                                   |
| `Up` / `Down` arrow key    | <p>Navigate inside the suggestion area:</p><ul><li>move between WProofreader suggestions;</li><li>select <strong>Add word</strong> or <strong>Ignore all</strong> actions.</li></ul> |
| `Enter` / `Space`          | Accept a suggestion, confirm action.                                                                                                                                                 |

### Tweaking settings <a href="#draft-keyboardnavigationforv3.x.x-tweakingsettings" id="draft-keyboardnavigationforv3.x.x-tweakingsettings"></a>

To access WProofreader settings, press **`Tab`** to highlight the badge. Then press **`Enter`** or **`Space`** to display the badge actions. Use the **`Left`** / **`Right`** arrow key to navigate to the **Settings** icon and press **`Enter`** or **`Space`** to open the Settings dialog.

Also, you can access the **Settings** from the proofread-in-dialog mode. Keep pressing **`Tab`** or **`Shift`** + **`Tab`** backwards until you focus on the **Settings** icon. It will be highlighted. Then press **`Enter`** or **`Space`** to confirm.

### **Spelling ignore options**

Use **`Tab`** to navigate between **Ignore options** in the Settings dialog. Select the desired option and press **`Space`** to enable/disable it. The changes are applied automatically.

| Keyboard command        | Description                                          |
| ----------------------- | ---------------------------------------------------- |
| `Tab` / `Shift` + `Tab` | Move between **Ignore options** forward or backward. |
| `Space`                 | Enable/disable the desired ignore option.            |

### **Language**

Take the steps below to select a language for proofreading.

* Use **`Tab`** to navigate to the **Language** section in the Settings dialog.
* Press **`Enter`** or **`Space`** to open the list of available languages.
* Use the **`Up`** / **`Down`** arrow key to select a desired language.
* Press **`Enter`** or **`Space`** to confirm the action.
* Press **`Escape`** to exit the Settings dialog.

Check the video below to see how to access and work with settings.

### **Dictionary**

In the Dictionaries settings, users can create new dictionaries, connect or delete existing ones, add or remove words from the dictionaries.

**Create or connect dictionary**

To create or connect a dictionary:

* Open the Settings dialog and navigate to **Go to Dictionary** by continuously pressing **`Tab`**.
* Press **`Enter`** or **`Space`** to open Dictionary settings.
* Press **`Tab`** to navigate to the **Enter a dictionary name** field and type in a name for your dictionary.
* Select **Create** or **Connect** and confirm your action by pressing **`Enter`** or **`Space`**. As a result of this action, you’ll either create a new dictionary or connect with an existing one.

**Add word**

To add a new word to a user dictionary, use **`Tab`** and navigate to the **Enter a new word** field. Type a new word and press **`Tab`** to move to the **Add** button. Confirm the action by pressing **`Space`**. Once the word is added, you’ll see a confirmation message: *“Word* successfully added."

**Delete word**

To delete a word from the dictionary, use the **`Up`** / **`Down`** arrow key to move between words and choose a word you want to remove. Confirm the deletion by pressing **`Space`** or **`Enter`**. Once the word is deleted, you’ll see a confirmation message: *“Word successfully* deleted."

**Rename dictionary**

To rename the dictionary, navigate to Dictionary settings using **`Tab`** and select **Rename** from the lis&#x74;**.** Confirm the action by pressing **`Space`** / **`Enter`**. Once the dictionary is renamed, you’ll see a confirmation message: *“Dictionary renamed”.*

**Disconnect dictionary**

To disconnect the dictionary, navigate to Dictionary settings using **`Tab`** and select **Disconnect** from the list. Confirm the action by pressing **`Space`** or **`Enter`**. Once the dictionary is disconnected, you’ll see a confirmation message *“Dictionary disconnected”*.

Check the video below to see how to manage dictionaries using keyboard navigation.

### **About**

WProofreader version and copyright info are presented in the Settings dialog. You may find it useful when providing information about your system to our support team.


# Spell and grammar check

WProofreader suggestions differ in three types:

* spelling (red underlines)
* grammar, punctuation (blue underlines)
* style (yellow underlines)

### Algorithmic suggestions

**Spelling suggestions** are generated by [Hunspell](https://github.com/hunspell/hunspell), a third-party open-source algorithmic spell checker and morphological analyzer that is used as a spelling engine in our product. In the checkkits it comes as 'hs'.

It checks word-by-word if the word is in the dictionary. If not, it generates the closest suggestion. In general, there are 13–14 steps, 11 of which can be repeated if the language has a lot of compounds that can be written as 1 word. For example, German or Dutch.

<div align="left"><img src="/files/3U2GJSht1cOJq7M4iG6C" alt="" width="216"></div>

For better suggestions, we rely on N-gram prioritization, functionality that is developed to reorganize (sort in another way) the suggestions based on the context. The context is two left words and two right words.

Also, we manually create spelling prioritization rules for English, German, Spanish, Italian, French, Portuguese, etc. that can be applied to the whole word or a part of it to prioritize valid suggestions. It can also give suggestions outside the scope that Hunspell has generated.

<div align="left"><img src="/files/8Ojd5gyarKTKyPta8L6s" alt="" width="267"></div>

Named Entity Recognition (NER) is another functionality to avoid false positives, that skips correction of unknown proper names. Sometimes there are inconsistencies that may underline the proper name in one sentence as spelling, and skip the same proper name in another sentence.

For English and German, we provide dialect support in the form of files with words written with different spellings in different dialects of the same language.

<div align="left"><img src="/files/DXkQu0W6yJ00CU1RweJy" alt="" width="321"></div>

**Grammar suggestions** are provided by the third-party grammar engine, [LanguageTool](https://languagetool.org/). In user checkkits it comes as 'lt' and has blue underlying. As well as Hunspell, this engine is algorithmic, so all the rules are written down where it should work and where not.\
LanguageTool supports 36 languages (excluding dialects), may give more than 1 suggestion and may have descriptions for grammar suggestions.

<div align="left"><img src="/files/1lvIVEUCqUaNPNAJdJK6" alt="" width="314"></div>

Starting from v6.6.0, our linguistic team modifies inconsistent and irrelevant grammar rules to improve the performance of the grammar engine.

### **AI-driven suggestions**

WProofreader AI-driven engine provides both spelling and grammar suggestions marked by red and blue underlines respectively. In the checkkits it comes as 'ai'.

We use in-house [RedPenNet (RPN) architecture](https://blog.wproofreader.com/announcing-redpennet-v2-a-step-forward-in-our-gec-approach/), based on [RoBERTa](https://huggingface.co/docs/transformers/en/model_doc/roberta) base model for WProofreader AI-driven engine.

99% of the time, the AI has only 1 suggestion. Suggestions are always context-dependent and removing or adding 1 word may change all suggestions in the sentence. Right now, suggestions have no explanations as to why something should be corrected.

Spelling suggestions are those that have a ratio of less than 0.5, meaning that the match and the suggestions are pretty similar. Additionally, the suggestion is word-to-word.

<div align="left"><img src="/files/N052wCpfWVfmlnXNj2vF" alt="" width="248"></div>

Grammar suggestions are those that have a ratio of more than 0.5, meaning that the match and the suggestions are not pretty similar. Suggestions include all corrections that were not classified as spelling.

NB! Some spelling suggestions may be underlined as grammar because the model doesn’t know the types.

<div align="left"><img src="/files/xjpZWWE3SLUNKpzrKj1V" alt="" width="363"></div>

#### Check kits

Users and admins can change the default proofreading configuration via check kits. As of now, there are several configurations to choose from:

* `lt_hs` – Provides standard spelling and grammar suggestions through algorithmic engines only; no AI involvement.
* `ai_lt_hs0` – AI-engine provides grammar and spelling suggestions. The algorithmic engine highlights spelling errors without showing suggestions; algorithmic grammar suggestions are also enabled.
* `ai_lt_hs1` – AI-engine provides grammar and spelling suggestions, with algorithmic grammar and spelling support where AI does not offer coverage.
* `ai` – Only AI-engine provides grammar and spelling suggestions; no additional support from algorithmic engines is applied.
* `ai_lt` – AI-engine provides grammar and spelling suggestions, with algorithmic grammar support where AI does not offer coverage.

To change the **server default** check kit per language (self-hosted), see [Check kits](/v6.10.0.0/deployment/configuration/application-server/check-kits).


# English

| Type                                                    | Erroneous sentence                                                                                       | Correct sentence                                                                                         | General category |
| ------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- | ---------------- |
| Tenses usage                                            | I am **talk** to you!                                                                                    | I am **talking** to you!                                                                                 | Grammar          |
|                                                         | I **saw** you tomorrow.                                                                                  | I **will see** you tomorrow.                                                                             | Grammar          |
|                                                         | I **already been** to this museum.                                                                       | I **have already** **been** to this museum.                                                              | Grammar          |
| Irregular verbs                                         | I **goed** hiking last week and it was amazing.                                                          | I **went** hiking last week and it was amazing.                                                          | Grammar          |
|                                                         | I **sleeped** very little today.                                                                         | I **slept** very little today.                                                                           | Grammar          |
| Subject-verb agreement                                  | She **go** to the market every day.                                                                      | She **goes** to the market every day.                                                                    | Grammar          |
|                                                         | Encyclopedia **contain** information about many things.                                                  | Encyclopedia **contains** information about many things.                                                 | Grammar          |
|                                                         | My sister and my mother **lives** in Ukraine.                                                            | My sister and my mother **live** in Ukraine.                                                             | Grammar          |
|                                                         | There **are** a book on the shelf.                                                                       | There **is** a book on the shelf.                                                                        | Grammar          |
|                                                         | The United States **are** big.                                                                           | The United States **is** big.                                                                            | Grammar          |
| Tense consistency                                       | I was eating dinner when he **comes** in.                                                                | I was eating dinner when he **came** in.                                                                 | Grammar          |
|                                                         | When she lived in Spain, she **is missing** her family a lot.                                            | When she lived in Spain, she **missed** her family a lot.                                                | Grammar          |
| Preposition usage                                       | I am good **in** mathematics.                                                                            | I am good **at** mathematics.                                                                            | Grammar          |
| Article usage                                           | She is **a** honest person.                                                                              | She is **an** honest person.                                                                             | Grammar          |
| Conditional clauses                                     | If I **will go** to the store, I will buy bread.                                                         | If I **go** to the store, I will buy bread.                                                              | Grammar          |
| Double negatives                                        | I don't need **no** help.                                                                                | I don't need **any** help.                                                                               | Grammar          |
| Verb-agreement error                                    | There **is have** been many changes recently.                                                            | There **have** been many changes recently.                                                               | Grammar          |
|                                                         | There **are have** been many changes recently.                                                           | There **have** been many changes recently.                                                               | Grammar          |
| Article-noun agreement                                  | A penny **a** **months** saves you a lot of money.                                                       | A penny **a** **month** saves you a lot of money.                                                        | Grammar          |
| Pluralization                                           | I have two **apple**.                                                                                    | I have two **apples**.                                                                                   | Grammar          |
| Irregular forms of nouns                                | There are two **knifes** in the kitchen.                                                                 | There are two **knives** in the kitchen.                                                                 | Grammar          |
|                                                         | Two **deers** were seen in the forest.                                                                   | Two **deer** were seen in the forest.                                                                    | Grammar          |
| Quantifier-noun agreement                               | I met some interesting **person** at the party.                                                          | I met some interesting **people** at the party.                                                          | Grammar          |
|                                                         | They have **a few** money this month.                                                                    | They have **a little** money this month.                                                                 | Grammar          |
| Possessive usage                                        | Mr **Smith** wife loves chocolate.                                                                       | Mr **Smith's** wife loves chocolate.                                                                     | Grammar          |
|                                                         | The **box'** lid is broken.                                                                              | The **box's** lid is broken.                                                                             | Grammar          |
|                                                         | She couldn't make it because of her **brothers** birthday party.                                         | She couldn't make it because of her **brother's** birthday party.                                        | Grammar          |
| Hyphenation                                             | She has a **ten year old** son.                                                                          | She has a **ten-year-old** son.                                                                          | Grammar          |
| Article usage                                           | Let's go on **picnic** today.                                                                            | Let's go on **a picnic** today.                                                                          | Grammar          |
|                                                         | He likes **a beef**.                                                                                     | He likes **beef**.                                                                                       | Grammar          |
| Personal pronouns                                       | Most monkeys don't like water, but **it** can swim well when they have to.                               | Most monkeys don't like water, but **they** can swim well when they have to.                             | Grammar          |
| Modal verb forms                                        | I **should did** my homework last night.                                                                 | I **should have done** my homework last night.                                                           | Grammar          |
|                                                         | He **cannot** do it yesterday.                                                                           | He **couldn't** do it yesterday.                                                                         | Grammar          |
| Used to                                                 | I **use to** be very shy.                                                                                | I **used to** be very shy.                                                                               | Grammar          |
| Passive                                                 | The boy **helped** by John.                                                                              | The boy **was helped** by John.                                                                          | Grammar          |
|                                                         | The baby **born** yesterday morning.                                                                     | The baby **was born** yesterday morning.                                                                 | Grammar          |
|                                                         | Tomas **will invited** to the party.                                                                     | Tomas **will be invited** to the party.                                                                  | Grammar          |
| Prepositions                                            | She quickly became acquainted **to** the new software after a few training sessions.                     | She quickly became acquainted **with** the new software after a few training sessions.                   | Grammar          |
|                                                         | Sometimes technological advancements seem to be divorced **with** the everyday needs of ordinary people. | Sometimes technological advancements seem to be divorced **from** the everyday needs of ordinary people. | Grammar          |
| Relative clause                                         | The stranger **which** helped me find the car was from Japan.                                            | The stranger **who** helped me find the car was from Japan.                                              | Grammar          |
|                                                         | My **brother** who lives in **Canada** is coming to visit next month.                                    | My brother, who lives in Canada, is coming to visit next month.                                          | Grammar          |
| Adjective clause                                        | Mr **Smith** the patient from room **101** said he was happy to see his family.                          | Mr **Smith,** the patient from room **101,** said he was happy to see his family.                        | Grammar          |
| Gerund usage                                            | Would you mind **repeat** that?                                                                          | Would you mind **repeating** that?                                                                       | Grammar          |
|                                                         | I **enjoy to have** a nice walk with my children.                                                        | I **enjoy having** a nice walk with my children.                                                         | Grammar          |
|                                                         | We talked **about to go** south for a vacation.                                                          | We talked **about going** south for a vacation.                                                          | Grammar          |
| Infinitive usage                                        | I **hope seeing** you soon.                                                                              | I **hope to see** you soon.                                                                              | Grammar          |
|                                                         | I was **proud seeing** you succeed.                                                                      | I was **proud to see** you succeed.                                                                      | Grammar          |
| Homophones                                              | She always wears nice **closes** to close the deal.                                                      | She always wears nice **clothes** to close the deal.                                                     | Grammar          |
| Common misspelling                                      | I **recieved** your message.                                                                             | I **received** your message.                                                                             | Spelling         |
| Phonetic mispelling                                     | I study **siense** at university.                                                                        | I study **science** at university.                                                                       | Spelling         |
| Capitalizations                                         | She has been living in **london** for ages.                                                              | She has been living in **London** for ages.                                                              | Spelling         |
| Prefixes confusion                                      | Parking in that area without a permit is considered **unlegal** and may result in a fine.                | Parking in that area without a permit is considered **illegal** and may result in a fine.                | Spelling         |
| American vs. British/Australian/Canadian and vice versa | I love the **colour** of your dress.                                                                     | I love the **color** of your dress.                                                                      | Spelling         |
| Run-on sentences                                        | I wanted to go to the **beach it** was such a beautiful day.                                             | I wanted to go to the **beach. It** was such a beautiful day.                                            | Style            |
| Redundancy                                              | He returned **back to** the office.                                                                      | He returned **to** the office.                                                                           | Style            |
| Missing comma after intro clause                        | After the **meeting** we went for dinner.                                                                | After the **meeting,** we went for dinner.                                                               | Punctuation      |
| Quotation marks                                         | **I** don’t **understand** she whispered.                                                                | **"I** don’t **understand,"** she whispered.                                                             | Punctuation      |
| Missing period                                          | She is my best **friend**                                                                                | She is my best **friend.**                                                                               | Punctuation      |


# German

| Type (English)                            | Type (German)                                      | Erroneous sentence                                                               | Correct sentence                                                                 | General category |
| ----------------------------------------- | -------------------------------------------------- | -------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | ---------------- |
| Conjugation in present tense              | Konjugation Präsens                                | ​Ich **komm** aus Brasilien.                                                     | ​Ich **komme** aus Brasilien.                                                    | Grammar          |
|                                           |                                                    | Er **arbeit** bei der Post.                                                      | Er **arbeitet** bei der Post.                                                    | Grammar          |
|                                           |                                                    | Ihr **kommen**.                                                                  | Ihr **kommt**.                                                                   | Grammar          |
| Subject-verb agreement conjugation        | Kongruenz von Subjekt und Verb bei der Konjugation | Sie **bin** verheiratet.                                                         | Sie **ist** verheiratet.                                                         | Grammar          |
|                                           |                                                    | Ich **möchtest** Urlaub machen.                                                  | Ich **möchtest** Urlaub machen.                                                  | Grammar          |
|                                           |                                                    | Er **essen** um 7 Uhr.                                                           | Er **isst** um 7 Uhr.                                                            | Grammar          |
| Word order                                | Wortreihenfolge                                    | Ich gehe jetzt ins Bett, weil ich **aufstehe morgens** immer schon um 6 **Uhr**. | Ich gehe jetzt ins Bett, weil ich **morgens** immer schon um 6 Uhr **aufstehe**. | Grammar          |
|                                           |                                                    | Um 8 Uhr **ich komme** in der Schule an.                                         | Um 8 Uhr **komme ich** in der Schule an.                                         | Grammar          |
|                                           |                                                    | Wie viele **hat er Bücher**?                                                     | Wie viele **Bücher hat er**?                                                     | Grammar          |
| Plural/singular noun forms                | Plural-/Singularformen von Nomen                   | Der **Väter** brachte sein Kind nach Hause.                                      | Der **Vater** brachte sein Kind nach Hause.                                      | Grammar          |
| Articles in accusative                    | Artikel im Akkusativ                               | Wie findest du **der** Kaffee?                                                   | Wie findest du **den** Kaffee?                                                   | Grammar          |
|                                           |                                                    | Möchten Sie **einen** Banane?                                                    | Möchten Sie **eine** Banane?                                                     | Grammar          |
| Articles in dative                        | Artikel im Dativ                                   |  Ich helfe **den** Mann.                                                         |  Ich helfe **dem** Mann.                                                         | Grammar          |
|                                           |                                                    | Sie gibt **das** Kind ein Buch.                                                  | Sie gibt **dem** Kind ein Buch.                                                  | Grammar          |
|                                           |                                                    | Wir fahren mit drei **Auton**.                                                   | Wir fahren mit drei **Autos**.                                                   | Grammar          |
| Negation                                  | Negation                                           |  Ich habe **nicht** Brot gegessen.                                               |  Ich habe **kein** Brot gegessen.                                                | Grammar          |
|                                           |                                                    | ​ Er geht **kein** ins Kino.                                                     | ​ Er geht **nicht** ins Kino.                                                    | Grammar          |
| Possessive pronoun                        | Possessivartikel                                   | Er hat **meine** Bruder geholfen.                                                | Er hat **meinem** Bruder geholfen.                                               | Grammar          |
|                                           |                                                    | Sie liebt **seinen** Mutter sehr.                                                | Sie liebt **seine** Mutter sehr.                                                 | Grammar          |
| Articles: interrogative and demonstrative | Artikel: interrogativ und demonstrativ             | **Welche** Mann?                                                                 | **Welcher** Mann?                                                                | Grammar          |
|                                           |                                                    | Mit **welche** Freundin gehst du ins Kino?                                       | Mit **welcher** Freundin gehst du ins Kino?                                      | Grammar          |
|                                           |                                                    | Ich sehe **diesen** Frau.                                                        | Ich sehe **diese** Frau.                                                         | Grammar          |
| Personal pronouns: accusative and dative  | Personalpronomen: Akkusativ und Dativ              | Die Frau geht mit **ihn**.                                                       | Die Frau geht mit **ihm**.                                                       | Grammar          |
|                                           |                                                    | Wir lieben **ihm** jetzt schon.                                                  | Wir lieben **ihn** jetzt schon.                                                  | Grammar          |
| Simple past tense                         | Präteritum                                         | Er **wart** müde.                                                                | Er **war** müde.                                                                 | Grammar          |
|                                           |                                                    | Du **hattestest** viele Bücher.                                                  | Du **hattest** viele Bücher.                                                     | Grammar          |
| Perfect tense                             | Perfekt                                            | Ich **habe** gegangen.                                                           | Ich **bin** gegangen.                                                            | Grammar          |
|                                           |                                                    | Ich habe **spielt**.                                                             | Ich habe **gespielt**.                                                           | Grammar          |
| Reflexive verbs                           | Reflexive Verben                                   | Du musst **sich** beeilen.                                                       | Du musst **dich** beeilen.                                                       | Grammar          |
|                                           |                                                    | Ich **setze auf** den Stuhl.                                                     | Ich **setze mich** auf den Stuhl.                                                | Grammar          |
|                                           |                                                    | Ich wasche **mir**.                                                              | Ich wasche **mich**.                                                             | Grammar          |
| Temporal prepositions                     | Temporale Präpositionen                            | Ich fahre **in den** Sommer nach Italien.                                        | Ich fahre **im** Sommer nach Italien.                                            | Grammar          |
|                                           |                                                    | Der Film beginnt **am** 20 Uhr.                                                  | Der Film beginnt **um** 20 Uhr.                                                  | Grammar          |
| Prepositions with dative                  | Präpositionen mit Dativ                            | Ich komme aus **die** Schweiz.                                                   | Ich komme aus **der** Schweiz.                                                   | Grammar          |
|                                           |                                                    | Ich komme **von** Frankreich.                                                    | Ich komme **aus** Frankreich.                                                    | Grammar          |
|                                           |                                                    | Ich fahre mit **meinen** Bruder.                                                 | Ich fahre mit **meinem** Bruder.                                                 | Grammar          |
| Prepositions with accusative              | Präpositionen mit Akkusativ                        | Das Geschenk ist für **meiner** Mutter sehr schön.                               | Das Geschenk ist für **meine** Mutter sehr schön.                                | Grammar          |
|                                           |                                                    | Wir laufen durch **dem** Park.                                                   | Wir laufen durch **den** Park.                                                   | Grammar          |
| Two-way prepositions                      | Wechselpräpositionen                               | An **die** Tasche sitzt ein Schmetterling.                                       | An **der** Tasche sitzt ein Schmetterling.                                       | Grammar          |
|                                           |                                                    | Vor **sie** sitzt ein Häschen.                                                   | Vor **ihr** sitzt ein Häschen.                                                   | Grammar          |
|                                           |                                                    | Ich gehe **im** Kino heute Abend.                                                | Ich gehe **ins** Kino heute Abend.                                               | Grammar          |
|                                           |                                                    | Er stellt die Flasche auf **dem** Tisch.                                         | Er stellt die Flasche auf **den** Tisch.                                         | Grammar          |
| Prepositions of place                     | Lokale Präpositionen                               | Ich gehe **auf** den Strand.                                                     | Ich gehe **an** den Strand.                                                      | Grammar          |
|                                           |                                                    | Ich bin **bei** dem Kino.                                                        | Ich bin **in** dem Kino.                                                         | Grammar          |
|                                           |                                                    | Ich komme **von** Deutschland.                                                   | Ich komme **aus** Deutschland.                                                   | Grammar          |
| Adjectives                                | Adjektiven                                         | Ich liebe den **nette** Mann.                                                    | Ich liebe den **netten** Mann.                                                   | Grammar          |
|                                           |                                                    | Ein **nett** Mann steht da.                                                      | Ein **netter** Mann steht da.                                                    | Grammar          |
| Comparative and comparison sentences      | Komparativ und Vergleichssätze                     | Peter ist größer **wie** Tom.                                                    | Peter ist größer **als** Tom.                                                    | Grammar          |
|                                           |                                                    | Meine Wohnung ist **groß** als deine.                                            | Meine Wohnung ist **größer** als deine.                                          | Grammar          |
|                                           |                                                    | Meine Tasche ist so teuer **als** deine.                                         | Meine Tasche ist so teuer **wie** deine.                                         | Grammar          |
|                                           |                                                    | Der Film war **spannenderer** als der andere.                                    | Der Film war **spannender** als der andere.                                      | Grammar          |
| Superlative                               | Superlativ                                         | Er ist am **schnellste**.                                                        | Er ist am **schnellsten**.                                                       | Grammar          |
| Connecting main clauses                   | Hauptsätze verbinden                               | Ich gehe ins Kino, aber **mache ich** keine Popcorn.                             | Ich gehe ins Kino, aber **ich mache** keine Popcorn.                             | Grammar          |
|                                           |                                                    | Wir haben keine Zeit, denn **müssen wir** lernen.                                | Wir haben keine Zeit, denn **wir müssen** lernen.                                | Grammar          |
|                                           |                                                    | Ich war krank, deshalb **ich bleibe** zu Hause.                                  | Ich war krank, deshalb **bleibe ich** zu Hause.                                  | Grammar          |
|                                           |                                                    | Du musst schnell arbeiten, sonst **du bekommst** Ärger.                          | Du musst schnell arbeiten, sonst **bekommst du** Ärger.                          | Grammar          |
| Subordinate clauses                       | Nebensätze                                         | Ich bleibe zu Hause, weil ich **bin müde**.                                      | Ich bleibe zu Hause, weil ich **müde bin**.                                      | Grammar          |
|                                           |                                                    | Wenn es regnet, **ich nehme** einen Schirm.                                      | Wenn es regnet, **nehme ich** einen Schirm.                                      | Grammar          |
| Positional and directional adverbs        | Positionsadverbien und Direktionaladverbien        | Ich fahre **dahin** Berlin.                                                      | Ich fahre **nach** Berlin.                                                       | Grammar          |
| Past Perfect                              | Plusquamperfekt                                    | Ich **hatte gegangen zur Schule**, bevor es geregnet hat.                        | Ich **bin zur Schule gegangen**, bevor es geregnet hat.                          | Grammar          |
| Prepositional adverbs and pronouns        | Präpositionaladverbien und -Pronomen               | Sie spricht oft über ihre Probleme, aber ich will nicht **daran** hören.         | Sie spricht oft über ihre Probleme, aber ich will nicht **davon** hören.         | Grammar          |
| Position and direction verbs              | Positions- und Direktionsverben                    | Ich **liege** das Buch auf den Tisch.                                            | Ich **lege** das Buch auf den Tisch.                                             | Grammar          |
| N-declension                              | N-Deklination                                      | Das ist die Tasche von dem **Junge**.                                            | Das ist die Tasche von dem **Jungen**.                                           | Grammar          |
|                                           |                                                    | Ich helfe **ein** **Mensch**.                                                    | Ich helfe **einem** **Menschen**.                                                | Grammar          |
|                                           |                                                    | Ich danke **der Herr**.                                                          | Ich danke **dem Herrn**.                                                         | Grammar          |
| Articles                                  | Artikle                                            | **Die** Thema ist interessant.                                                   | **Das** Thema ist interessant.                                                   | Grammar          |
|                                           |                                                    | Ich verstehe **die** Problem.                                                    | Ich verstehe **das** Problem.                                                    | Grammar          |
|                                           |                                                    | **Die** Mädchen sitzt im Restaurant.                                             | **Das** Mädchen sitzt im Restaurant.                                             | Grammar          |
| Adjective declension                      | Die Deklination der Adjektive                      | Ich habe **ein** **groß** Hund.                                                  | Ich habe **einen** **großen** Hund.                                              | Grammar          |
|                                           |                                                    | Ich spreche mit dem **klug** Mann.                                               | Ich spreche mit dem **klugen** Mann.                                             | Grammar          |
|                                           |                                                    | **Frisch** Brot ist lecker.                                                      | **Frisches** Brot ist lecker.                                                    | Grammar          |
| Irregular verbs                           | Unregelmäßige Verben                               | Ich habe **gegesse**.                                                            | Ich habe **gegessen**.                                                           | Grammar          |
|                                           |                                                    | Wir haben **getrinkt viel Wasser**.                                              | Wir haben **viel Wasser getrunken**.                                             | Grammar          |
|                                           |                                                    | Sie hat **geschreibt einen Brief**.                                              | Sie hat **einen Brief geschrieben**.                                             | Grammar          |
| Irregular forms of the nouns              | Unregelmäßige Formen der Nomen                     | Ich habe viele **Museums** besucht.                                              | Ich habe viele **Museen** besucht.                                               | Spelling         |
|                                           |                                                    | Ich habe ein **Visa** für Europa.                                                | Ich habe ein **Visum** für Europa.                                               | Spelling         |
| Diminutive                                | Diminutiv                                          | Ich habe ein **Blumchen** für dich.                                              | Ich habe ein **Blümchen** für dich.                                              | Spelling         |
|                                           |                                                    | Er spielt mit seinem **Hundchen**.                                               | Er spielt mit seinem **Hündchen**.                                               | Spelling         |
|                                           |                                                    | Er hat das Buch **geschriben**.                                                  | Er hat das Buch **geschrieben**.                                                 | Spelling         |
| Homophones                                | Homophone                                          | Ich gehe in die **statt**.                                                       | Ich gehe in die **Stadt**.                                                       | Spelling         |
| Non-idiomatic adjective use               | Ungebräuchliche temporale Adjektivverwendung       | **Vorherig** waren wir ein Bier trinken.                                         | **Vorher** waren wir ein Bier trinken.                                           | Style            |
| Strong swear language                     | Kraftausdrücke                                     | **Mondkalb**                                                                     |                                                                                  | Style            |
| Anglicisms                                | Anglizismen                                        | **Application**                                                                  | **Anwendung; Applikation**                                                       | Style            |


# Spanish

| Type (English)            | Type (Spanish)                         | Erroneous sentence                                                                                | Correct sentence                                                                                  | General category |
| ------------------------- | -------------------------------------- | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ---------------- |
| Common confusions         | Confusión entre ser y estar            | **Soy** cansado.                                                                                  | **Estoy** cansado.                                                                                | Grammar          |
|                           |                                        | Su padre **es** enfermo.                                                                          | Su padre **está** enfermo.                                                                        | Grammar          |
|                           | Confusión entre hay, ahí, ay           | **Ay** muchas frutas en la tienda.                                                                | **Hay** muchas frutas en la tienda.                                                               | Grammar          |
|                           | Confusión entre por y para             | Este regalo es **por** ti.                                                                        | Este regalo es **para** ti.                                                                       | Grammar          |
|                           |                                        | Él estudiaba **para** dos horas.                                                                  | Él estudiaba **por** dos horas.                                                                   | Grammar          |
|                           | Confusión entre sino y si no           | No quiero la paleta roja, **si no** la azul.                                                      | No quiero la paleta roja, **sino** la azul.                                                       | Grammar          |
| Irregular verbs           | Verbos irregulares                     | Yo **senti** triste porque no tengo amigos.                                                       | Yo **me sentí** triste porque no tengo amigos.                                                    | Grammar          |
|                           |                                        | Nosotros **juguemos** en el parque.                                                               | Nosotros **jugamos** en el parque.                                                                | Grammar          |
|                           |                                        | **Fuistes** al cine sin mí, ¿verdad?                                                              | **Fuiste** al cine sin mí, ¿verdad?                                                               | Grammar          |
|                           |                                        | He **rompido** la ventana sin querer.                                                             | He **roto** la ventana sin querer.                                                                | Grammar          |
|                           |                                        | Él **tenió** un problema.                                                                         | Él **tuvo** un problema.                                                                          | Grammar          |
| Agreement errors          | Concordancia sujeto–verbo              | Ellos **habla** inglés.                                                                           | ​Ellos **hablan** inglés.                                                                         | Grammar          |
|                           |                                        | El problema es que los niños no **sabe** cómo comportarse.                                        | El problema es que los niños no **saben** cómo comportarse.                                       | Grammar          |
|                           |                                        | Parece que tus hermanos **está** en casa.                                                         | Parece que tus hermanos **están** en casa.                                                        | Grammar          |
|                           |                                        | Mis amigos dijeron que él no **sabían** la respuesta.                                             | Mis amigos dijeron que él no **sabía** la respuesta.                                              | Grammar          |
|                           | Concordancia sustantivo–adjetivo       | Los resultados **obtenidas** durante la investigación fueron prometedores.                        | Los resultados **obtenidos** durante la investigación fueron prometedores.                        | Grammar          |
|                           |                                        | La variedad de opiniones **expresados** en **nuestro** clase refleja la complejidad del discurso. | La variedad de opiniones **expresadas** en **nuestra** clase refleja la complejidad del discurso. | Grammar          |
| Double Negatives Misuse   | El uso incorrecto de la doble negación | No quiero **no hacer nada**.                                                                      | No quiero **hacer nada**.                                                                         | Grammar          |
| Misuse of reflexive verbs | Mal uso de los verbos reflexivos       | Yo **levanto** a las 6.30.                                                                        | Yo **me levanto** a las 6.30.                                                                     | Grammar          |
|                           |                                        | **Me veo** la película.                                                                           | **Veo** la película.                                                                              | Grammar          |
| Use of prepositions       | Uso de "de"                            | Mi papá es **des** **de** China, mi mamá es de Polonia.                                           | Mi papá es **de** China, mi mamá es de Polonia.                                                   | Grammar          |
|                           |                                        | Estoy cansada **correr**.                                                                         | Estoy cansada **de correr**.                                                                      | Grammar          |
|                           | Preposiciones de lugar                 | El perro está durmiendo **debajo** la mesa.                                                       | El perro está durmiendo **debajo de** la mesa.                                                    | Grammar          |
|                           |                                        | El banco está al **fondo** la calle.                                                              | El banco está al **fondo de** la calle.                                                           | Grammar          |
|                           | Uso de "a" con personas                | Veo **Cintia** cada semana en la clase.                                                           | Veo **a Cintia** cada semana en la clase.                                                         | Grammar          |
| Tenses usage              | Presente y Pasado                      | Yo **estudio** español el año pasado.                                                             | Yo **estudié** español el año pasado.                                                             | Grammar          |
|                           | Uso del subjuntivo                     | Espero que él **tiene** suerte.                                                                   | Espero que él **tenga** suerte.                                                                   | Grammar          |
|                           |                                        | Es importante que ustedes **están** listos.                                                       | Es importante que ustedes **estén** listos.                                                       | Grammar          |
|                           |                                        | Es posible que ella **va** a la clase.                                                            | Es posible que ella **vaya** a la clase.                                                          | Grammar          |
| Capitalization errors     | Errores de mayúsculas                  | Yo vivo aquí desde el dos de **Mayo**.                                                            | Yo vivo aquí desde el dos de **mayo**.                                                            | Grammar          |
| Adjectives                | Adjetivos                              | Juan escribe **bueno**.                                                                           | Juan escribe **bien**.                                                                            | Grammar          |
|                           |                                        | Cuando nació Roberto, que fue el **niño segundo**, yo recuerdo que para mí era hermoso.           | Cuando nació Roberto, que fue el **segundo niño**, yo recuerdo que para mí era hermoso.           | Grammar          |
|                           |                                        | **Todo** mi juventud que yo viví fue bajo guerra.                                                 | **Toda** mi juventud que yo viví, fue bajo guerra.                                                | Grammar          |
| Adverbs                   | Adverbios                              | Ella trabajaba más rápido **de** él.                                                              | Ella trabajaba más rápido **que** él.                                                             | Grammar          |
|                           |                                        | Ya no podía salir a trabajar, **por que** era tan peligroso.                                      | Ya no podía salir a trabajar, **porque** era tan peligroso.                                       | Grammar          |
|                           |                                        | Yo podía leer el español **tal** bien como lo leo.                                                | Yo podía leer el español **tan** bien como lo leo.                                                | Grammar          |
| Conjunctions              | Conjunciones                           | ¿Quieres pasta **o** otra cosa para la cena?                                                      | ¿Quieres pasta **u** otra cosa para cena?                                                         | Grammar          |
|                           |                                        | No me gusta el café, **pero** el té.                                                              | No me gusta el café, **sino** el té.                                                              | Grammar          |
| Lack of accents in words  | Falta de tildes en palabras            | Yo quiero mucho a mi **papa**.                                                                    | Yo quiero mucho a mi **papá**.                                                                    | Spelling         |
|                           |                                        | **El esta** en casa.                                                                              | **Él está** en casa.                                                                              | Spelling         |
|                           |                                        | ¿**Como estas** hoy?                                                                              | ¿**Cómo estás** hoy?                                                                              | Spelling         |
|                           |                                        | **Si**, me gusta mucho.                                                                           | **Sí**, me gusta mucho.                                                                           | Spelling         |
|                           |                                        | ¿**Que** quieres comer?                                                                           | ¿**Qué** quieres comer?                                                                           | Spelling         |
| Vocative comma            | La coma de vocativo                    | Oye, **Juan** escúchame cuando te hablo.                                                          | Oye, **Juan,** escúchame cuando te hablo.                                                         | Grammar          |
| Reflexive verbs           | Verbos reflexivos                      | **Él levantó** temprano.                                                                          | **Él se levantó** temprano.                                                                       | Grammar          |
|                           |                                        | Nosotros **divertimos** en la fiesta.                                                             | Nosotros **nos divertimos** en la fiesta.                                                         | Grammar          |
|                           |                                        | **Ella** acordó del cumpleaños.                                                                   | **Ella se** acordó del cumpleaños.                                                                | Grammar          |
|                           |                                        | **Ellos** sentaron en la silla.                                                                   | **Ellos se** sentaron en la silla.                                                                | Grammar          |
| Gustar-type verbs         | Verbos tipo gustar                     | A mí me **gusta** mucho los libros.                                                               | A mí me **gustan** mucho los libros.                                                              | Grammar          |
| Capitalization            | Uso de mayúsculas                      | Vivo en **españa**.                                                                               | Vivo en **España**.                                                                               | Spelling         |
|                           |                                        | El **Lunes** es mi día favorito.                                                                  | El **lunes** es mi día favorito.                                                                  | Spelling         |
| Personal 'a'              | A' personal                            | Veo **mi** hermano todos los días.                                                                | Veo **a mi** hermano todos los días.                                                              | Grammar          |
|                           |                                        | Conozco **María** desde la infancia.                                                              | Conozco **a María** desde la infancia.                                                            | Grammar          |
| Question formation        | Formación de preguntas                 | ¿Cómo **que estás**?                                                                              | ¿Cómo **estás**?                                                                                  | Grammar          |
| Imperative                | Modo imperativo                        | ¡**Haceme** un favor!                                                                             | ¡**Hazme** un favor!                                                                              | Grammar          |
| Prepositions              | Preposiciones                          | Estudio **por** el examen.                                                                        | Estudio **para** el examen.                                                                       | Grammar          |
|                           |                                        | Llegué **en** Madrid.                                                                             | Llegué **a** Madrid.                                                                              | Grammar          |
| Haber vs Tener auxiliary  | Auxiliar haber vs tener                | **Habían** muchas personas allí.                                                                  | **Había** muchas personas allí.                                                                   | Grammar          |
|                           |                                        | **Hubieron** problemas ayer.                                                                      | **Hubo** problemas ayer.                                                                          | Grammar          |
| Past participle agreement | Concordancia del participio            | Las cartas fueron **escritos** por él.                                                            | Las cartas fueron **escritas** por él.                                                            | Grammar          |
|                           |                                        | La ventana fue **abierto**.                                                                       | La ventana fue **abierta**.                                                                       | Grammar          |
|                           |                                        | Los libros están **perdido**.                                                                     | Los libros están **perdidos**.                                                                    | Grammar          |
| Definite articles         | Artículos definidos                    | Me gusta **la** agua fría.                                                                        | Me gusta **el** agua fría.                                                                        | Grammar          |
|                           |                                        | Voy **a el** cine esta noche.                                                                     | Voy **al** cine esta noche.                                                                       | Grammar          |
|                           |                                        | Vengo **de el** trabajo.                                                                          | Vengo **del** trabajo.                                                                            | Grammar          |
|                           |                                        | **La** águila es grande.                                                                          | **El** águila es grande.                                                                          | Grammar          |
| Indefinite articles       | Artículos indefinidos                  | Ella es **un** médica.                                                                            | Ella es **una** médica.                                                                           | Grammar          |
|                           |                                        | Necesito **una** alma fuerte.                                                                     | Necesito **un** alma fuerte.                                                                      | Grammar          |
|                           |                                        | **Unos** personas llegaron.                                                                       | **Unas** personas llegaron.                                                                       | Grammar          |
| Partitive sense           | Sentido partitivo                      | Quiero **de agua**.                                                                               | Quiero **agua**.                                                                                  | Grammar          |
|                           |                                        | Compré **de pan**.                                                                                | Compré **pan**.                                                                                   | Grammar          |
|                           |                                        | Bebió **de vino** en la fiesta.                                                                   | Bebió **vino** en la fiesta.                                                                      | Grammar          |
| Invariable words          | Invariables                            | **Ademáses** de eso.                                                                              | **Además** de eso.                                                                                | Spelling         |
| Anglicism                 | Estilo                                 | Necesito borrar estos **emails**.                                                                 | Necesito borrar estos **correos**.                                                                | Style            |
| Anglicism                 | Estilo                                 | Tengo **un meeting** importante.                                                                  | Tengo **una reunión** importante.                                                                 | Style            |
| Numbers                   | Números                                | Tengo **ventiuno** años.                                                                          | Tengo **veintiún** años.                                                                          | Spelling         |
| Punctuation               | Puntuación                             | **Que** tal **estas?**                                                                            | **¿Qué** tal **estás?**                                                                           | Grammar          |
|                           |                                        | **Que** maravilla!                                                                                | **¡Qué** maravilla!                                                                               | Grammar          |
| Formation of the plural   | Formación del plural                   | Ellos están **felizes** juntos.                                                                   | Ellos están **felices** juntos.                                                                   | Spelling         |
|                           |                                        | Los **cactuses** necesitan muy poca agua para sobrevivir.                                         | Los **cactus** necesitan muy poca agua para sobrevivir.                                           | Spelling         |


# French

| Type (English)                    | Type (French)                   | Erroneous sentence                      | Correct sentence                                  | General category |
| --------------------------------- | ------------------------------- | --------------------------------------- | ------------------------------------------------- | ---------------- |
| Present tense conjugation         | Conjugaison du présent          | -                                       | Je mange toujours dans ce restaurant.             | Grammar          |
|                                   |                                 | Tu **aimer** le chocolat.               | Tu **aimes** le chocolat.                         | Grammar          |
|                                   |                                 | **Nous va** au cinéma.                  | **Nous allons** au cinéma.                        | Grammar          |
|                                   |                                 | **Ils finisse** leurs devoirs.          | **Ils finissent** leurs devoirs.                  | Grammar          |
| Avoir vs Être auxiliary           | Auxiliaire avoir vs être        | **Je suis** mangé une pomme.            | **J'ai** mangé une pomme.                         | Grammar          |
|                                   |                                 | Il **a** venu hier soir.                | Il **est** venu hier soir.                        | Grammar          |
|                                   |                                 | Elle **a** arrivée en retard.           | Elle **est** arrivée en retard.                   | Grammar          |
|                                   |                                 | Nous avons **sortis** ensemble.         | Nous avons **sorti** ensemble.                    | Grammar          |
| Past participle agreement         | Accord du participe passé       | Les lettres que j'ai **écrit**.         | Les lettres que j'ai **écrites**.                 | Grammar          |
| Definite articles                 | Articles définis                | Je vais **à le** marché.                | Je vais **au** marché.                            | Grammar          |
|                                   |                                 | Il vient **de** **le** bureau.          | Il vient **du** bureau.                           | Grammar          |
|                                   |                                 | **Le élève** étudie.                    | **L'élève** étudie.                               | Grammar          |
|                                   |                                 | Je regarde **le télévision**.           | Je regarde **la télévision**.                     | Grammar          |
| Indefinite articles               | Articles indéfinis              | Je n'ai pas **de des** **amis**.        | Je n'ai pas **d'amis**.                           | Grammar          |
|                                   |                                 | C'est **une** homme sympa.              | C'est **un** homme sympa.                         | Grammar          |
| Partitive articles                | Articles partitifs              | Il y a **de les** pommes.               | Il y a **des** pommes.                            | Grammar          |
| Gender agreement                  | Accord en genre                 | Une **grand** maison.                   | Une **grande** maison.                            | Grammar          |
|                                   |                                 | **Cette homme** est gentil.             | **Cet homme** est gentil.                         | Grammar          |
|                                   |                                 | **Une beau** fleur.                     | **Une belle** fleur.                              | Grammar          |
| Number agreement                  | Accord en nombre                | **Les enfant** jouent.                  | **Les enfants** jouent.                           | Grammar          |
|                                   |                                 | **Des livre** **intéressant**.          | **Des livres** **intéressants**.                  | Grammar          |
|                                   |                                 | Vingt **euro**.                         | Vingt **euros**.                                  | Grammar          |
|                                   |                                 | Les **nouveau** professeurs.            | Les **nouveaux** professeurs.                     | Grammar          |
| Subjunctive mood                  | Subjonctif                      | Il faut que tu **viens**.               | Il faut que tu **viennes**.                       | Grammar          |
|                                   |                                 | Je doute qu'il **a** raison.            | Je doute qu'il **ait** raison.                    | Grammar          |
|                                   |                                 | Bien qu'il **est** malade.              | Bien qu'il **soit** malade.                       | Grammar          |
| Conditional vs future             | Conditionnel vs futur           | Si **j'aurais** le temps, je viendrais. | Si **j'avais** le temps, je viendrais.            | Grammar          |
| Direct object pronouns            | Pronoms COD                     | Je la **connais** **elle**.             | Je la **connais**.                                | Grammar          |
| Negation                          | Négation                        | Je ne suis **pas jamais** allé.         | Je ne suis **jamais** allé.                       | Grammar          |
|                                   |                                 | Il n'a **pas rien** dit.                | Il n'a **rien** dit.                              | Grammar          |
| Question formation                | Formation des questions         | **Tu viens quand?**                     | **Quand viens-tu ? / Quand est-ce que tu viens?** | Grammar          |
| Imperative                        | Impératif                       | **Donne-moi le**!                       | **Donne-le-moi** !                                | Grammar          |
| Comparatives and superlatives     | Comparatif et superlatif        | Elle est **plus mieux** que lui.        | Elle est **mieux** que lui.                       | Grammar          |
|                                   |                                 | C'est **le plus** meilleur.             | C'est **le** meilleur.                            | Grammar          |
| Reflexive verbs                   | Verbes pronominaux              | Elle s'est **réveillé** tard.           | Elle s'est **réveillée** tard.                    | Grammar          |
|                                   |                                 | Nous nous sommes **amusé**.             | Nous nous sommes **amusés**.                      | Grammar          |
| Word order                        | Ordre des mots                  | **Souvent je** **mange** au restaurant. | **Je mange souvent** au restaurant.               | Grammar          |
|                                   |                                 | **Hier** j'ai vu ton frère.             | **Hier,** j'ai vu ton frère.                      | Grammar          |
|                                   |                                 | **Probablement il viendra.**            | **Il viendra probablement.**                      | Grammar          |
|                                   |                                 | Peut-être **que il** pleuvra.           | Peut-être **qu'il** pleuvra.                      | Grammar          |
| Redundancy and pleonasm           | Redondance et pléonasme         | **Monter en haut.**                     | **Monter**.                                       | Grammar          |
|                                   |                                 | **Descendre en bas.**                   | **Descendre**.                                    | Grammar          |
|                                   |                                 | Se **rappeler de** quelque chose.       | Se **rappeler** quelque chose.                    | Grammar          |
| Common errors with specific verbs | Erreurs avec verbes spécifiques | Je me r**appelle de** cette histoire.   | Je me **rappelle** cette histoire.                | Grammar          |
| Capitalization                    | Majuscules                      | Je parle **Français**.                  | Je parle **français**.                            | Spelling         |
|                                   |                                 | **nous** allons en **italie**.          | **Nous** allons en **Italie**.                    | Spelling         |
|                                   |                                 | Le **Lundi**, je travaille.             | Le **lundi**, je travaille.                       | Spelling         |
| Silent letters and liaison        | Lettres muettes et liaison      | Ils **vont-t-au** cinéma.               | Ils **vont au** cinéma.                           | Spelling         |
| False friends and anglicisms      | Faux amis et anglicismes        | C'est très **exciting**.                | C'est très **excitant**.                          | Spelling         |
| Elision errors                    | Erreurs d'élision               | **Le ami** de Marie.                    | **L'ami** de Marie.                               | Spelling         |
|                                   |                                 | Je **ne ai** pas compris.               | Je **n'ai** pas compris.                          | Spelling         |
|                                   |                                 | **Si il** vient.                        | **S'il** vient.                                   | Spelling         |
|                                   |                                 | **La hôtel** est fermé.                 | **L'hôtel** est fermé.                            | Spelling         |
| Homophones                        | Homophones                      | J'ai **était** au marché.               | J'ai **été** au marché.                           | Grammar          |
|                                   |                                 | Il **et** parti tôt.                    | Il **est** parti tôt.                             | Grammar          |
|                                   |                                 | **Ces** ce que je pense.                | **C'est** ce que je pense.                        | Grammar          |
| Spelling mistakes                 | Fautes d'orthographe            | Je **dévelope** mes compétences.        | Je **développe** mes compétences.                 | Spelling         |
|                                   |                                 | C'est un **apartement**.                | C'est un **appartement**.                         | Spelling         |
| Formal vs informal register       | Registre soutenu vs familier    | **T'as** pas compris ou quoi?           | **Tu n'as** pas compris ?                         | Style            |
| Punctuation                       | Ponctuation                     | Bonjour,comment alle&#x7A;**-vous?**    | Bonjour, comment allez-**vous ?**                 | Punctuation      |
|                                   |                                 | Qu'est-ce que vous **faites?**          | Qu'est-ce que vous **faites ?**                   | Punctuation      |
|                                   |                                 | Il a **dit:** **"Je viens".**           | Il a **dit : « Je viens ».**                      | Punctuation      |
|                                   |                                 | C'est **super!**                        | C'est **super !**                                 | Punctuation      |


# Italian

| Type (English)              | Type (Italian)            | Erroneous sentence           | Correct sentence                         | General category |
| --------------------------- | ------------------------- | ---------------------------- | ---------------------------------------- | ---------------- |
| Present tense conjugation   | Coniugazione del presente | Io **lavor** in ufficio.     | Io **lavoro** in ufficio.                | Grammar          |
| Irregular verb conjugations | Verbi irregolari          | Io **ando** al bar.          | Io **vado** al bar.                      | Grammar          |
| Plural forms                | Forme plurali             | **I bambine** giocano.       | **Le bambine** giocano.                  | Grammar          |
| Definite articles           | Articoli determinativi    | **La zio** è gentile.        | **Lo zio** è gentile.                    | Grammar          |
| Indefinite articles         | Articoli indeterminativi  | **Una zaino** nuovo.         | **Uno zaino** nuovo.                     | Grammar          |
| Punctuation errors          | Errori di punteggiatura   | Sì! **è** vero.              | Sì! **È** vero!                          | Grammar          |
| Double consonants           | Consonanti doppie         | Ho **roto** il bicchiere.    | Ho **rotto** il bicchiere.               | Spelling         |
| Accent marks                | Accenti                   | **Piu** di dieci.            | **Più** di dieci.                        | Spelling         |
|                             |                           | La **citta** è grande.       | La **città** è grande.                   | Spelling         |
| Common homophones           | Omofoni comuni            | **Laquale** cosa.            | **La qual** cosa.                        | Spelling         |
|                             |                           | **Qual'è** il problema?      | **Qual è** il problema?                  | Spelling         |
| QU vs CU spelling           | QU vs CU ortografia       | La **squola** inizia domani. | La **scuola** inizia domani.             | Spelling         |
| Capitalization errors       | Errori di maiuscole       | Vado in **francia**.         | Vado in **Francia**.                     | Spelling         |
| Common spelling mistakes    | Errori ortografici comuni | **Sopratutto** è importante. | **Soprattutto** è importante.            | Spelling         |
| Typography and spacing      | Tipografia e spaziatura   | **E'molto** bello.           | **È molto** bello.                       | Spelling         |
| Swearing words              | Linguaggio offensivo      | **Porca troia**, cosa fai?   | (Probabilmente un linguaggio offensivo.) | Style            |


# Korean

| Type                       | Erroneous sentence | Correct sentence | General category |
| -------------------------- | ------------------ | ---------------- | ---------------- |
| Spacing – particle merging | 집에가다               | 집에 가다            | Spelling         |
| Vowel typo ㅐ/ㅔ             | 고맙읍니다              | 고맙습니다            | Spelling         |
| Phonetic spelling          | 머르겠다               | 모르겠다             | Spelling         |
| Wrong contraction          | 걸로해                | 걸로 해             | Spelling         |
| Homophone confusion        | 왠일이야               | 웬일이야             | Spelling         |
| Wrong consonant cluster    | 괜찬네                | 괜찮네              | Spelling         |
| Typo from adjacent keys    | 감사합나다              | 감사합니다            | Spelling         |
| Spacing – auxiliary “지”    | 하지말아               | 하지 말아            | Spelling         |
| Past tense ending error    | 했읍니다               | 했습니다             | Spelling         |
| Confused jamo combo        | 힘들언                | 힘들어              | Spelling         |
| Wrong vowel harmony        | 그랫어                | 그랬어              | Spelling         |


# Hungarian

| Type                       | Erroneous sentence                         | Correct sentence                           | General category |
| -------------------------- | ------------------------------------------ | ------------------------------------------ | ---------------- |
| Missing accent             | A ház nagyon **szep** volt.                | A ház nagyon **szép** volt.                | Spelling         |
| Missing long vowel         | **Ugy** gondolom, igaza van.               | **Úgy** gondolom, igaza van.               | Spelling         |
| Incorrect vowel length     | Jó **otlet**, hogy elmegyünk.              | Jó **ötlet**, hogy elmegyünk.              | Spelling         |
| Consonant doubling mistake | Ez egy **csodaálatos** látvány volt.       | Ez egy **csodálatos** látvány volt.        | Spelling         |
| Incorrect digraph          | A gyerekek **gyerekekel** játszanak.       | A gyerekek **gyerekekkel** játszanak.      | Spelling         |
| Incorrect digraph “sz/s”   | Ez a **haz** nagyon régi.                  | Ez a **ház** nagyon régi.                  | Spelling         |
| Missing letter             | A film szerintem nagyon **legjob** volt.   | A film szerintem nagyon **legjobb** volt.  | Spelling         |
| Missing long vowel         | A könyvnek még nincs **cimet** írva.       | A könyvnek még nincs **címet** írva.       | Spelling         |
| Consonant reduction        | Már megint **eggyütt** vagytok?            | Már megint **együtt** vagytok?             | Spelling         |
| Wrong consonant length     | A fiú **mutatot** nekem valamit.           | A fiú **mutatott** nekem valamit.          | Spelling         |
| Wrong suffix               | A ház **házakbol** készült anyagokból van. | A ház **házakból** készült anyagokból van. | Spelling         |
| Missing umlaut             | A **kulso** design nagyon fontos.          | A **külső** design nagyon fontos.          | Spelling         |
| Short/long vowel           | Tegnap **irtam** egy levelet.              | Tegnap **írtam** egy levelet.              | Spelling         |
| Adjacent-key typo          | A terv **átalakítas** alatt van.           | A terv **átalakítás** alatt van.           | Spelling         |
| Wrong digraph              | Ez **anyira** érdekes volt.                | Ez **annyira** érdekes volt.               | Spelling         |
| Wrong vowel in suffix      | Mentem az **autoval**.                     | Mentem az **autóval**.                     | Spelling         |
| Transposed letters         | Ez egy komoly **progléma**.                | Ez egy komoly **probléma**.                | Spelling         |
| Redundant “s”              | Mindent **sszerint** tettem.               | Mindent **szerint** tettem.                | Spelling         |
| Missing accent             | Volt egy kis **szivbaj**.                  | Volt egy kis **szívbaj**.                  | Spelling         |
| Softened consonant lost    | A ruha nagyon **hagyomáyos** lett.         | A ruha nagyon **hagyományos** lett.        | Spelling         |
| Wrong long vowel           | Ez nagyon **kulon** áll tőlem.             | Ez nagyon **külön** áll tőlem.             | Spelling         |
| Wrong digraph              | A süti nagyon **zsir** lett.               | A süti nagyon **zsír** lett.               | Spelling         |


# Turkish

| Error type                       | Erroneous sentence                         | Correct sentence                          | General category |
| -------------------------------- | ------------------------------------------ | ----------------------------------------- | ---------------- |
| Missing diacritic (ç→c)          | Bu **cözüm** oldukça iyi.                  | Bu **çözüm** oldukça iyi.                 | Spelling         |
| Missing diacritic (ş→s)          | Dışarıda hava **soguk**.                   | Dışarıda hava **soğuk**.                  | Spelling         |
| Missing ı/İ dot (ı↔i)            | Bu iş kolay **değıl**.                     | Bu iş kolay **değil**.                    | Spelling         |
| Consonant doubling error         | Sınavda oldukça **zorrlandım**.            | Sınavda oldukça **zorlandım**.            | Spelling         |
| Missing soft g (ğ)               | **Bildigim** kadarıyla sorun yok.          | **Bildiğim** kadarıyla sorun yok.         | Spelling         |
| Missing umlaut                   | Bu **odev** çok zordu.                     | Bu **ödev** çok zordu.                    | Spelling         |
| Soft vs hard consonant confusion | **Kapıyi** kapatır mısın?                  | **Kapıyı** kapatır mısın?                 | Spelling         |
| Foreign word typo                | Bu proje tamamen **proffesyonel** yapıldı. | Bu proje tamamen **profesyonel** yapıldı. | Spelling         |
| Swap of o/ö                      | Çok **ozel** bir gündü.                    | Çok **özel** bir gündü.                   | Spelling         |
| Wrong soft/hard consonant        | Bu tarif **gercekten** **kolaymıs**.       | Bu tarif **gerçekten** **kolaymış**.      | Spelling         |
| Exceptions for apostrophe use    | **Türkçe'yi** çok seviyorum.               | **Türkçeyi** çok seviyorum.               | Spelling         |


# Macedonian

| Error type              | Erroneous sentence        | Correct sentence          | General category |
| ----------------------- | ------------------------- | ------------------------- | ---------------- |
| Doubling consonant      | Овој филм е одличенн.     | Овој филм е одличен.      | Spelling         |
| Missing consonant       | Имам потреба од советни.  | Имам потреба од совети.   | Spelling         |
| Wrong vowel             | Тоа е вистинцка приказна. | Тоа е вистинска приказна. | Spelling         |
| Adjacent-key typo       | Се чувстувам добро.       | Се чувствувам добро.      | Spelling         |
| Omitted consonant       | Тоа е мојот созател.      | Тоа е мојот создател.     | Spelling         |
| Wrong doubled consonant | Дойдов многу каснно.      | Дојдов многу касно.       | Spelling         |
| Extra consonant         | Тоа беше многу труудно.   | Тоа беше многу трудно.    | Spelling         |
| Adjacent-key typo       | Многу ми е ладнл.         | Многу ми е ладно.         | Spelling         |
| Missing vowel           | Ова е важн момент.        | Ова е важен момент.       | Spelling         |
| Double vowel            | Ова е многуу смешно.      | Ова е многу смешно.       | Spelling         |
| Wrong stress            | Тоа е најдобрà опција.    | Тоа е најдобра опција.    | Spelling         |
| Phonetic spelling       | Се чуствувам чудно.       | Се чувствувам чудно.      | Spelling         |


# Dutch

| Type                          | Erroneous sentence                                 | Correct sentence                                   | General category |
| ----------------------------- | -------------------------------------------------- | -------------------------------------------------- | ---------------- |
| Agreement mistakes            | **Hij loop** naar school.                          | **Hij loopt** naar school.                         | Grammar          |
|                               | Wij **gaat** morgen weg.                           | Wij **gaan** morgen weg.                           | Grammar          |
| Article mistakes              | Ik **heb de boek** gelezen.                        | Ik **heb het boek** gelezen.                       | Grammar          |
|                               | **Het** hond loopt in de tuin.                     | **De** hond loopt in de tuin.                      | Grammar          |
|                               | Waar is **de kind**?                               | Waar is **het kind**?                              | Grammar          |
|                               | Ik drink **de water**.                             | Ik drink **het water**.                            | Grammar          |
|                               | Ik ga zwemmen in **het zee**.                      | Ik ga zwemmen in **de zee**.                       | Grammar          |
| Adjective agreement errors    | Een **groen** boom.                                | Een **groene** boom.                               | Grammar          |
|                               | Het **oud** man.                                   | Het **oude** man.                                  | Grammar          |
| Diminutive formation mistakes | Een **kleine** hondje.                             | Een **klein** hondje.                              | Grammar          |
|                               | **De** boekje is interessant.                      | **Het** boekje is interessant.                     | Grammar          |
| Double consonant error        | Ik ga naar de **bibliotheeck**.                    | Ik ga naar de **bibliotheek**.                     | Spelling         |
|                               | Hij is een goede **vriendt**.                      | Hij is een goede **vriend**.                       | Spelling         |
|                               | De trein vertrekt van het **peroon**.              | De trein vertrekt van het **perron**.              | Spelling         |
| Vowel error                   | Hij werkt als **ingeniuer**.                       | Hij werkt als **ingenieur**.                       | Spelling         |
|                               | We eten vanavond bij een **restaurent**.           | We eten vanavond bij een **restaurant**.           | Spelling         |
|                               | Ik ben moe van het reizen naar het **buotenland**. | Ik ben moe van het reizen naar het **buitenland**. | Spelling         |
| Verb conjugation spelling     | Ik heb een appel **gegetten**.                     | Ik heb een appel **gegeten**.                      | Grammar          |
| Plural exception              | Hij zag twee **muizes** in de keuken.              | Hij zag twee **muizen** in de keuken.              | Spelling         |
|                               | De **kalvers** grazen in het veld.                 | De **kalveren** grazen in het veld.                | Spelling         |
| Compound word error           | Hij werkt op het **school gebouw**.                | Hij werkt op het **schoolgebouw**.                 | Spelling         |
| Swearing words                | Die **bamivreter** denkt dat hij alles beter weet. | (Waarschijnlijk beledigende taal.)                 | Style            |
|                               | Doe normaal, **bokkelul**, en luister eens!        | (Waarschijnlijk beledigende taal.)                 | Style            |
| Blasphemy                     | **Godverdomme**, ik ben mijn sleutels weer kwijt!  | (Waarschijnlijk beledigende taal.)                 | Style            |


# Swedish

| Type                                                              | Erroneous sentence                                                        | Correct sentence                                                          | General category |
| ----------------------------------------------------------------- | ------------------------------------------------------------------------- | ------------------------------------------------------------------------- | ---------------- |
| Gender agreement errors in adjective, participle, and article use | Det var **ett mörk kväll**.                                               | Det var **en mörk kväll**.                                                | Grammar          |
|                                                                   | Det var **ett urholkad sten**.                                            | Det var **en urholkad sten**.                                             | Grammar          |
|                                                                   | Hon såg **en stängt dörr**.                                               | Hon såg **en stängd dörr**.                                               | Grammar          |
|                                                                   | Det var **en förvånat uppvaknande**.                                      | Det var **ett förvånat uppvaknande**.                                     | Grammar          |
|                                                                   | Det var **ett urladdad batteri**.                                         | Det var **ett urladdat batteri**.                                         | Grammar          |
| Infinitive marker misuse                                          | Han **brukade att** komma sent.                                           | Han **brukade** komma sent.                                               | Grammar          |
| Pronominal usage before occupational titles (förre vs. förra)     | **Förra** chefen på Arla var en trevlig prick.                            | **Förre** chefen på Arla var en trevlig prick.                            | Grammar          |
| Contamination of fixed phrases and prepositions                   | <p>Vi har många <strong>planer om</strong> att bygga om kontoret.<br></p> | <p>Vi har många <strong>planer på</strong> att bygga om kontoret.<br></p> | Grammar          |
|                                                                   | Han försökte t**a självmord** men överlevde.                              | Han försökte **begå självmord** men överlevde.                            | Grammar          |
|                                                                   | **Mellan klockan fem till sju** var det möte.                             | **Mellan klockan fem och sju** var det möte.                              | Grammar          |
|                                                                   | **Mellan Göteborg till Malmö** går tåget varje timme.                     | **Mellan Göteborg och Malmö** går tåget varje timme.                      | Grammar          |
|                                                                   | De framförde flera **klagomål över** ledningen.                           | De framförde flera **klagomål mot** ledningen.                            | Grammar          |
|                                                                   | Jag **ångrar på att** jag inte följde med.                                | Jag **ångrar att jag** inte följde med.                                   | Grammar          |
| Incorrect collocation                                             | Läraren påverkade eleverna **i stor grad**.                               | Läraren påverkade eleverna **i hög grad**.                                | Grammar          |
| Orthographic error or misspelling                                 | Hon köpte en **väscka** på marknaden.                                     | Hon köpte en **väska** på marknaden.                                      | Spelling         |
| Incorrect compounding                                             | **Allt mer** information sprids via sociala medier.                       | **Alltmer** information sprids via sociala medier.                        | Spelling         |
| Standardized abbreviation formatting                              | Bland deltagarna fanns Anna, Erik, **m fl** från avdelningen.             | Bland deltagarna fanns Anna, Erik, **m.fl.** från avdelningen.            | Spelling         |
| Incorrect compound spelling                                       | Flickorna kom **överrens**.                                               | Flickorna kom **överens**.                                                | Spelling         |
| Phonetic misspelling                                              | Hon ville **masera** sina axlar efter träningen.                          | Hon ville **massera** sina axlar efter träningen.                         | Spelling         |
| Lexical confusion / word misuse                                   | Alla hinder bör **i möjligaste motto** undanröjas.                        | Alla hinder bör **i möjligaste måtto** undanröjas.                        | Spelling         |
| Incorrect lexical form / homophone confusion                      | Vi ska dansa och släppa **los** hela kvällen.                             | Vi ska dansa och släppa **loss** hela kvällen.                            | Spelling         |
| Capitalization rule                                               | Jag ska börja träna på **Fredag**.                                        | Jag ska börja träna på **fredag**.                                        | Spelling         |
|                                                                   | Min födelsedag är i **November**.                                         | Min födelsedag är i **november**.                                         | Spelling         |
| Stylistic reordering for clarity                                  | Det är nog bäst att du får **en till klubba**.                            | Det är nog bäst att du får **en klubba till**.                            | Style            |
| Sentence-initial capitalization                                   | **det** regnar i dag.                                                     | **Det** regnar i dag.                                                     | Grammar          |
| Redundant word duplication                                        | Han gick **till till** affären.                                           | Han gick **till** affären.                                                | Style            |
| Excessive whitespace                                              | **Hon gick** till affären.                                                | **Hon gick** till affären.                                                | Style            |
| Punctuation spacing                                               | Hon gick **hem.Han** följde efter.                                        | Hon gick **hem. Han** följde efter.                                       | Punctuation      |
|                                                                   | Vi ses **imorgon ,** hoppas jag.                                          | Vi ses **imorgon,** hoppas jag.                                           | Punctuation      |
| Punctuation redundancy                                            | Vi åker till **stranden,,** sen äter vi.                                  | Vi åker till **stranden,** sen äter vi.                                   | Punctuation      |
| Unpaired brackets                                                 | Hon viskade: **"Vi** måste gå **nu.**                                     | Hon viskade: **"Vi** måste gå **nu."**                                    | Punctuation      |


# Japanese

| Type                                                      | Erroneous sentence          | Correct sentence            | General category |
| --------------------------------------------------------- | --------------------------- | --------------------------- | ---------------- |
| Case-marking error (incorrect accusative marker)          | りんごお食べる                     | りんごを食べる                     | Grammar          |
|                                                           | 私は毎朝新聞お読みます。                | 私は毎朝新聞を読みます。                | Grammar          |
| Case particle omission                                    | それは問題の解決なる。                 | それは問題の解決になる。                | Grammar          |
| Nominalization                                            | 今一番すべきのは何ですか？               | 今一番すべきなのは何ですか？              | Grammar          |
| Particle misuse                                           | これわおいしいです。                  | これはおいしいです。                  | Grammar          |
|                                                           | 近所へ買い物に行くのが好きです。            | 近所で買い物に行くのが好きです。            | Grammar          |
|                                                           | 雲も一つなく空が晴れていた。              | 雲一つなく空が晴れていた。               | Grammar          |
|                                                           | 2時までに夜更かしした。                | 2時まで夜更かしした。                 | Grammar          |
| Verb conjugation error                                    | 用して説明する                     | 用いて説明する                     | Grammar          |
|                                                           | 資料を集めってください。                | 資料を集めてください。                 | Grammar          |
| Interrogative word error                                  | どやって行くの？                    | どうやって行くの？                   | Grammar          |
| Verb transitivity error                                   | 鍵を見つかった。                    | 鍵を見つけた。                     | Grammar          |
|                                                           | 勉強が続きたいと思います。               | 勉強を続けたいと思います。               | Grammar          |
| Object particle omission                                  | 新聞読むのが好きです。                 | を読むのが好きです。                  | Grammar          |
| Verb–noun form confusion                                  | 暮らすが長くなる                    | 暮らしが長くなる                    | Grammar          |
|                                                           | AとBの違うはなに？                  | AとBの違いはなに？                  | Grammar          |
| Conjugation error                                         | それは大きな問題であた。                | それは大きな問題であった。               | Grammar          |
| Unnatural pluralization                                   | 学生たちが教室に入った。                | 学生が教室に入った。                  | Grammar          |
| Missing particle                                          | 父は母より先亡くなった。                | 父は母より先に亡くなった。               | Grammar          |
| Aspectual mismatch                                        | ずっと開けたら、寒くなった。              | ずっと開けていたら、寒くなった。            | Grammar          |
| Verb misuse                                               | 鳩は言う。                       | 鳩は鳴く。                       | Grammar          |
| Incorrect adjective usage                                 | 最初な日記には名前しか書いていなかった。        | 最初の日記には名前しか書いていなかった。        | Grammar          |
| Missing possessive particle                               | 大学時に始めたアルバイトです。             | 大学の時に始めたアルバイトです。            | Grammar          |
| Incorrect conjunctive form                                | この公園はきれいも広いです。              | この公園はきれいで広いです。              | Grammar          |
| Adjective form confusion                                  | 大きいな部屋に住みたいです。              | 大きい部屋に住みたいです。               | Grammar          |
| Negative past tense conjugation error                     | 昨日は雨が降ったない。                 | 昨日は雨が降らなかった。                | Grammar          |
| Word choice error (semantic mismatch)                     | このパンの成分は小麦です。               | このパンの材料は小麦です。               | Grammar          |
| Verb formation error                                      | セミナーに参加に行く予定です。             | セミナーに参加しに行く予定です。            | Grammar          |
| Incorrect modifier usage                                  | イベントにはたくさんな人が集まった。          | イベントにはたくさんの人が集まった。          | Grammar          |
| Copula misuse with verb                                   | 宿題が多すぎて困るです。                | 宿題が多すぎて困ります。                | Grammar          |
| Incorrect potential form                                  | 怒りは簡単に抑えできると思っていた。          | 怒りは簡単に抑えられると思っていた。          | Grammar          |
| Incorrect verb-particle combination                       | コーヒーをあり                     | コーヒーがある                     | Grammar          |
| Honorific prefix misuse                                   | ご返事をお待ちしております。              | お返事をお待ちしております。              | Grammar          |
| Adjective conjugation error                               | 日本語の文法はむずかしと感じる人が多い。        | 日本語の文法はむずかしいと感じる人が多い。       | Grammar          |
| Incorrect particle usage for possession                   | 彼女は友達がいる                    | 彼女には友達がいる                   | Grammar          |
| Improper use of small kana after prolonged sound mark (ー) | キャラの名前は「たまーゃ」です。            | キャラの名前は「たまーや」です。            | Grammar          |
| Hypercorrect potential form (ra-ire kotoba)               | このパンはナイフで切られる。              | このパンはナイフで切れる。               | Grammar          |
| Missing 'ra' in potential/passive form (ra-nuki kotoba)   | 法は権力に阿ず。                    | 法は権力に阿らず。                   | Grammar          |
| Omission of 'ra' in potential form (ra-nuki kotoba)       | 彼ならすぐに答えを決めれると思う。           | 彼ならすぐに答えを決められると思う。          | Grammar          |
| Redundant potential-passive form (lettuce word)           | ナビを使えば最短距離で行けれるよ。           | ナビを使えば最短距離で行けるよ。            | Grammar          |
| Incorrect kanji conversion                                | その推測は当たらずとも遠からずと言える。        | その推測は中らずといえども遠からずと言える。      | Grammar          |
| Incorrect verb composition                                | スリルを味あわせるジェットコースター。         | スリルを味わわせるジェットコースター。         | Grammar          |
| Collocation error                                         | 彼のあやまちに怒り心頭に達することもあった。      | 彼のあやまちに怒り心頭に発することもあった。      | Grammar          |
| Misuse of kanji                                           | 事実に基ずく話。                    | 事実に基づく話。                    | Grammar          |
|                                                           | 強しては事を仕損ずるというように、焦らないほうがいい。 | 急いては事を仕損じるというように、焦らないほうがいい。 | Grammar          |
| Fixed expression misuse                                   | 彼の努力については言わずもかなだと思う。        | 彼の努力については言わずもがなだと思う。        | Grammar          |
| Incorrect okurigana                                       | 彼の態度は本当に腹立だしい。              | 彼の態度は本当に腹立たしい。              | Grammar          |
| Archaic expression misuse                                 | 彼は稀に見ぬ優秀なエンジニアだ。            | 彼は稀に見る優秀なエンジニアだ。            | Grammar          |
| Expression error                                          | こにちは                        | こんにちは                       | Grammar          |
|                                                           | 始めもして、田中と申します。              | 始めまして、田中と申します。              | Grammar          |
|                                                           | この文は正しいげと、少しわかりにくい。         | この文は正しいけど、少しわかりにくい。         | Grammar          |
|                                                           | 彼はプレゼンでけっこしたと思う。            | 彼はプレゼンでけっこうしたと思う。           | Grammar          |
| Kana usage error                                          | はい、お待ちどお様。                  | はい、お待ちどう様。                  | Grammar          |
| Fixed expression misuse                                   | 聞くことによると、彼は海外に引っ越したらしい。     | 聞くところによると、彼は海外に引っ越したらしい。    | Style            |
| Redundant expression                                      | 暮らすことができる                   | 暮らせる                        | Style            |
|                                                           | この件は全て一任します。                | この件は一任します。                  | Style            |
| Punctuation error                                         | したがって。                      | したがって                       | Punctuation      |


# Portuguese

| Type (English)            | Type (Portuguese)                | Erroneous sentence                     | Correct sentence                        | General category |
| ------------------------- | -------------------------------- | -------------------------------------- | --------------------------------------- | ---------------- |
| Gender agreement          | <p>Concordância<br>de gênero</p> | A petiz brincava no jardim.            | A petiza brincava no jardim.            | Grammar          |
|                           |                                  | Vimos a juiz no tribunal.              | Vimos a juíza no tribunal.              | Grammar          |
|                           |                                  | A aprendiz chegou atrasado.            | O aprendiz chegou atrasado.             | Grammar          |
| Number agreement          | <p>Concordância<br>de número</p> | As casa são grande.                    | As casas são grandes.                   | Grammar          |
|                           |                                  | Os menino brinca no parque.            | Os meninos brinca no parque.            | Grammar          |
| Person agreement          | Concordância de pessoa           | Eu gosta de café.                      | Eu gosto de café.                       | Grammar          |
|                           |                                  | Eles gosto de futebol.                 | Eles gostam de futebol.                 | Grammar          |
|                           |                                  | Eles quer jogar futebol e basquetebol  | Eles querem jogar futebol e basquetebol | Grammar          |
| Object pronouns           | Pronomes oblíquos                | Quando encontro-te no café?            | Quando te encontro no café?             | Grammar          |
|                           |                                  | Sempre vejo-o no parque.               | Sempre o vejo no parque.                | Grammar          |
|                           |                                  | Talvez encontre-me contigo amanhã.     | Talvez me encontre contigo amanhã.      | Grammar          |
| Subject pronouns          | Pronomes retos                   | Nos somos amigos.                      | Nós somos amigos.                       | Grammar          |
|                           |                                  | Detalha te os pormenores.              | Detalha tu os pormenores.               | Grammar          |
|                           |                                  | Te és muito inteligente.               | Tu és muito inteligente.                | Grammar          |
| Possessive pronouns       | Pronomes possessivos             | O meu amiga chegou.                    | O minha amiga chegou.                   | Grammar          |
|                           |                                  | As seu decisões foram acertadas.       | As suas decisões foram acertadas.       | Grammar          |
|                           |                                  | Os teu livros estão aqui.              | Os teus livros estão aqui.              | Grammar          |
| Variable nouns agreement  | Substantivos variáveis           | A minha filha é uma aprendiz dedicada. | A minha filha é uma aprendiza dedicada. | Grammar          |
|                           |                                  | A petiz estava perdida na feira.       | A petiza estava perdida na feira.       | Grammar          |
|                           |                                  | Conheci uma andaluz muito simpática.   | Conheci uma andaluza muito simpática.   | Grammar          |
| Invariable nouns          | Sustantivos invariáveis          | As calça está rasgada.                 | As calças estão rasgadas.               | Grammar          |
| Past participle agreement | Concordância do particípio       | As cartas foram escrito por ele.       | As cartas foram escritas por ele.       | Grammar          |
| Past participle agreement | Concordância do particípio       | Os livros estão perdido.               | Os livros estão perdidos.               | Grammar          |
| Definite articles         | Artigos definidos                | Gosto de a música brasileira.          | Gosto da música brasileira.             | Grammar          |
|                           |                                  | Vou a o cinema esta noite.             | Vou ao cinema esta noite.               | Grammar          |
|                           |                                  | Ele veio de o trabalho.                | Ele veio do trabalho.                   | Grammar          |
| Indefinite articles       | Artigos indefinidos              | Ela é um médica.                       | Ela é uma médica.                       | Grammar          |
|                           |                                  | Pedro tornou-se uma engenheiro.        | Pedro tornou-se um engenheiro.          | Grammar          |
| Subjunctive mood          | Modo subjuntivo                  | Espero que ele vem à festa.            | Espero que ele venha à festa.           | Grammar          |
|                           |                                  | Quero que tu fazes o trabalho.         | Quero que tu faças o trabalho.          | Grammar          |
|                           |                                  | Duvido que ela tem razão.              | Duvido que ela tenha razão.             | Grammar          |
| Contractions              | Contrações                       | Vou a a escola.                        | Vou à escola.                           | Grammar          |
|                           |                                  | Vou a as aulas todos os dias.          | Vou às aulas todos os dias.             | Grammar          |
| English calques           | Calques do inglês                | Furtou a identidade dele.              | Usurpou a identidade dele.              | Grammar          |
|                           |                                  | Roubaram a minha identidade.           | Usurparam a minha identidade.           | Grammar          |
| Currency symbol position  | Posição de Símbolos Monetários   | Custa €50.                             | Custa 50 €.                             | Style            |
|                           |                                  | Vale 75$.                              |                                         | Style            |
|                           |                                  | Gastei 30¥.                            |                                         | Style            |
| Nasal sounds              | Sons nasais                      | Eles tem muitos amigos.                | Eles têm muitos amigos.                 | Spelling         |
| Nasal sounds              | Sons nasais                      | Ele vém de longe.                      | Ele vem de longe.                       | Spelling         |
| Homophones                | Homófonos                        | A cerca de duas horas.                 | Há cerca de duas horas.                 | Spelling         |
|                           |                                  | Houveram muitos problemas.             | Houve muitos problemas.                 | Spelling         |
|                           |                                  | Fazem dois anos que não o vejo.        | Faz dois anos que não o vejo.           | Spelling         |
| Compound words            | Palavras compostas               | Vou re-fazer o trabalho.               | Vou refazer o trabalho.                 | Spelling         |
|                           |                                  | É uma co-incidência.                   | É uma coincidência.                     | Spelling         |
|                           |                                  | O auto falante não funciona.           | O altifalante não funciona.             | Spelling         |
| Hyphenation               | Hifenização                      | Ele é bem humorado.                    | Ele é bem-humorado.                     | Spelling         |
|                           |                                  | Preciso de um guarda chuva.            | Preciso de um guarda-chuva.             | Spelling         |
| Redundancy                | Redundância                      | Vou subir para cima.                   | Vou subir.                              | Style            |
|                           |                                  | Ele desceu para baixo.                 | Ele desceu.                             | Style            |
| Pleonasm                  | Pleonasmo                        | Vou entrar para dentro.                | Vou entrar.                             | Style            |
|                           |                                  | Repetiu de novo a história.            | Repetiu a história.                     | Style            |
|                           |                                  | Ele saiu para fora da sala.            | Ele saiu para fora da sala.             | Style            |


# Portuguese (Brazil)

| Type (English)                       | Type (Portuguese)                     | Erroneous sentence                       | Correct sentence                     | General category |
| ------------------------------------ | ------------------------------------- | ---------------------------------------- | ------------------------------------ | ---------------- |
| Past participle agreement            | Concordância do particípio            | Os livros estão perdido.                 | Os livros estão perdidos.            | Grammar          |
| Definite articles                    | Artigos definidos                     | Gosto de a música brasileira.            | Gosto da música brasileira.          | Grammar          |
| Definite articles                    | Artigos definidos                     | Vou a o cinema hoje à noite.             | Vou ao cinema hoje à noite.          | Grammar          |
| Definite articles                    | Artigos definidos                     | Ele veio de o trabalho.                  | Ele veio do trabalho.                | Grammar          |
| Definite articles                    | Artigos definidos                     | Estamos em a escola.                     | Estamos na escola.                   | Grammar          |
| Indefinite articles                  | Artigos indefinidos                   | Ela é um médica.                         | Ela é uma médica.                    | Grammar          |
| Gender agreement                     | Concordância de gênero                | Uma problema difícil.                    | Um problema difícil.                 | Grammar          |
| Number agreement                     | Concordância de número                | Os menino estão felizes.                 | Os meninos estão felizes.            | Grammar          |
| Number agreement                     | Concordância de número                | As flores são linda.                     | As flores são lindas.                | Grammar          |
| Number agreement                     | Concordância de número                | Dois gato pretos.                        | Dois gatos pretos.                   | Grammar          |
| Number agreement                     | Concordância de número                | Muitas pessoa chegaram.                  | Muitas pessoas chegaram.             | Grammar          |
| Subjunctive mood                     | Modo subjuntivo                       | Espero que ele vem à festa.              | Espero que ele venha à festa.        | Grammar          |
| Capitalization                       | Uso de maiúsculas                     | Falo Português e Inglês.                 | Falo português e inglês.             | Spelling         |
| Capitalization                       | Uso de maiúsculas                     | Moro no brasil.                          | Moro no Brasil.                      | Spelling         |
| Nasal sounds                         | Sons nasais                           | Eles tem muitos amigos.                  | Eles têm muitos amigos.              | Spelling         |
| Nasal sounds                         | Sons nasais                           | Ele vém de longe.                        | Ele vem de longe.                    | Spelling         |
| Contractions                         | Contrações                            | Vou a a escola.                          | Vou à escola.                        | Grammar          |
| Spelling mistakes                    | Erros de ortografia                   | Uma excessão importante.                 | Uma exceção importante.              | Spelling         |
| Double consonants                    | Ortografia                            | Ele tem uma personalidade aggressiva.    | Ele tem uma personalidade agressiva. | Spelling         |
| S vs SS                              | Ortografia                            | É uma questão de intereçe público.       | É uma questão de interesse público.  | Spelling         |
| C vs Ç                               | Ortografia                            | Preciso de uma explicacão.               | Preciso de uma explicação.           | Spelling         |
| Silent H                             | Ortografia                            | Este é um homem onesto.                  | Este é um homem honesto.             | Spelling         |
| Accent exceptions                    | Exceções                              | Ele tem um sotáque diferente.            | Ele tem um sotaque diferente.        | Spelling         |
| Plural exceptions                    | Exceções                              | Os caractéres especiais.                 | Os caracteres especiais.             | Spelling         |
| Plural exceptions                    | Exceções                              | Dois hamburguéres, por favor.            | Dois hambúrgueres, por favor.        | Spelling         |
| Homophones                           | Homófonos                             | A cerca de duas horas.                   | Há cerca de duas horas.              | Spelling         |
| Redundancy                           | Estilo                                | Vou subir para cima.                     | Vou subir.                           | Style            |
| Pleonasm                             | Estilo                                | Vou entrar para dentro.                  | Vou entrar.                          | Style            |
| Compound words                       | Ortografia                            | Ele é bem humorado.                      | Ele é bem‑humorado.                  | Spelling         |
| Compound words                       | Ortografia                            | Preciso de um guarda chuva.              | Preciso de um guarda‑chuva.          | Spelling         |
| Hyphenation                          | Ortografia                            | Vou re‑fazer o trabalho.                 | Vou refazer o trabalho.              | Spelling         |
| Hyphenation                          | Ortografia                            | É uma co‑incidência.                     | É uma coincidência.                  | Spelling         |
| Regional variations                  | Variações                             | Vou à casa de banho.                     | Vou ao banheiro.                     | Spelling         |
| Accent rules                         | Acentuação                            | Ele tem uma idéia brilhante.             | Ele tem uma ideia brilhante.         | Spelling         |
| Variant spellings (pt\_PT vs pt\_BR) | Ortografia variantes (PT-PT vs PT-BR) | O aluno mostrou um óptimo resultado.     | O aluno mostrou um ótimo resultado.  | Spelling         |
| Variant spellings (pt\_PT vs pt\_BR) | Ortografia variantes (PT-PT vs PT-BR) | Esta acção foi importante.               | Esta ação foi importante.            | Spelling         |
| Variant spellings (pt\_PT vs pt\_BR) | Ortografia variantes (PT-PT vs PT-BR) | Este projecto é interessante.            | Este projeto é interessante.         | Spelling         |
| Regional vocabulary                  | Vocabulário regional                  | Vou apanhar o autocarro para o trabalho. | Vou pegar o ônibus para o trabalho.  | Spelling         |
| Regional vocabulary                  | Vocabulário regional                  | Vou ao talho comprar carne.              | Vou ao açougue comprar carne.        | Spelling         |
| Regional vocabulary                  | Vocabulário regional                  | Preciso de um telemóvel novo.            | Preciso de um celular novo.          | Spelling         |


# Danish

| Type                       | Erroneous sentence                                    | Correct sentence                                     | General category |
| -------------------------- | ----------------------------------------------------- | ---------------------------------------------------- | ---------------- |
| Double consonants (mm)     | Jeg går til arbejde hver dag og komer hjem sent.      | Jeg går til arbejde hver dag og kommer hjem sent.    | Spelling         |
| Diacritics (å)             | Vi spiste frokost paa resturanten i gaar eftermiddag. | Vi spiste frokost på resturanten i går eftermiddag.  | Spelling         |
| Consonant substitution     | Hun køpte nye sko i butikken og betalte kontant.      | Hun købte nye sko i butikken og betalte kontant.     | Spelling         |
| Diacritics (ae/æ)          | Jeg laeser avisen hver morgen og drikker kaffe.       | Jeg læser avisen hver morgen og drikker kaffe.       | Spelling         |
| Vowel cofusion (u/o)       | Vejret var dårligt i går med regn og turden.          | Vejret var dårligt i går med regn og torden.         | Spelling         |
| Double consonants (kk, tt) | Skolen begynder kloken otte og sluter klokken tre.    | Skolen begynder klokken otte og slutter klokken tre. | Spelling         |
| Consonant omission         | Biblioteket er lukket om mandagen og åbner tirdag.    | Biblioteket er lukket om mandagen og åbner tirsdag.  | Spelling         |
| Consonant omission         | Hun arbejder som lærer og underviser i mateatik.      | Hun arbejder som lærer og underviser i matematik.    | Spelling         |
| Double consonants (dd)     | Hunden gør højt når postbudet kommer forbi.           | Hunden gør højt, når postbuddet kommer forbi.        | Spelling         |
| Compound words             | Vi fejrer fødseldag med kage og bobler i haven.       | Vi fejrer fødselsdag med kage og bobler i haven.     | Spelling         |
| Consonant substitution     | Naboerne flytter ud i morgen, og nye kommer int.      | Naboerne flytter ud i morgen, og nye kommer ind.     | Spelling         |
| Compound words             | Forældene henter børnene fra skole klokken to.        | Forældrene henter børnene fra skolen klokken to.     | Spelling         |


# Polish

| Type                             | Erroneous sentence       | Correct sentence         | General category |
| -------------------------------- | ------------------------ | ------------------------ | ---------------- |
| Number agreement                 | Te dziecko biega.        | To dziecko biega.        | Grammar          |
| Confusion: c/ć                   | Lubię czytac ksiazki.    | Lubię czytać książki.    | Spelling         |
| Confusion: e/ę                   | Jestem szczesliwy.       | Jestem szczęśliwy.       | Spelling         |
| Capitalization                   | jadę do krakowa.         | Jadę do Krakowa.         | Spelling         |
| Capitalization                   | Pracuję w linkedin.      | Pracuję w LinkedIn.      | Spelling         |
| Adjective with a negating prefix | Ten dom jest nie ładny.  | Ten dom jest nieładny.   | Spelling         |
| Confusion: h/ch                  | Hłopak idzie do szkoły.  | Chłopak idzie do szkoły. | Spelling         |
| Confusion: ó/u                   | To jest muj pies.        | To jest mój pies.        | Spelling         |
| Irregular noun forms             | To są te ręcy.           | To są te ręce.           | Spelling         |
| Confusion: ż/rz                  | Może pójdziemy do morża? | Może pójdziemy do morza? | Spelling         |
| Confusion: rz/sz                 | Muszę się spierzyć.      | Muszę się spieszyć.      | Spelling         |
| Confusion: ż/z                   | On przeż to cierpi.      | On przez to cierpi.      | Spelling         |
| Confusion: sc/ść                 | Lubię jesc jabłka.       | Lubię jeść jabłka.       | Spelling         |
| Redundancy                       | Przez długi okres czasu. | Przez długi okres.       | Style            |
| Redundancy                       | Cofnąć się do tyłu.      | Cofnąć się.              | Style            |
| Spelling: h/ch                   | Hodzi po ulicy.          | Chodzi po ulicy.         | Spelling         |


# Slovak

| Type                 | Erroneous sentence                            | Correct sentence                               | General category |
| -------------------- | --------------------------------------------- | ---------------------------------------------- | ---------------- |
| Pronoun usage        | Spýtali sa nás, koho dom hľadáme.             | Spýtali sa nás, čí dom hľadáme.                | Grammar          |
| Adjective agreement  | Dal som darček pekné inteligentným dievčatám. | Dal som darček pekným inteligentným dievčatám. | Grammar          |
| Comma before 'ktorý' | Chlap ktorý odišiel.                          | Chlap, ktorý odišiel.                          | Grammar          |
| Comma before 'že'    | Ako sa mohlo stať že na to zabudol?           | Ako sa mohlo stať, že na to zabudol?           | Grammar          |
| Missing accent: á    | Pekné dievčata.                               | Pekné dievčatá.                                | Spelling         |
| Missing accent: ý    | Byvam tu.                                     | Bývam tu.                                      | Spelling         |
| Missing accent: í    | Vidim ťa.                                     | Vidím ťa.                                      | Spelling         |
| Missing accent: š    | Idem do skoly.                                | Idem do školy.                                 | Spelling         |
| Proper names         | Pracujem pre Tiktok už mnoho rokov.           | Pracujem pre TikTok už mnoho rokov.            | Spelling         |
| Capitalization       | Idem do bratislavy.                           | Idem do Bratislavy.                            | Spelling         |
| Confusion: í/ý       | To je môj stríko.                             | To je môj strýko.                              | Spelling         |


# Croatian

| Type                 | Erroneous sentence                                      | Correct sentence                                       | General category |
| -------------------- | ------------------------------------------------------- | ------------------------------------------------------ | ---------------- |
| Incorrect word form  | To je stvarno dobar savijet.                            | To je stvarno dobar savjet.                            | Spelling         |
| Incorrect word form  | Ovo je zaista prekrasan osijećaj.                       | Ovo je zaista prekrasan osjećaj.                       | Spelling         |
| Missing consonant    | U školi smo učili o elekricitetu.                       | U školi smo učili o elektricitetu.                     | Spelling         |
| Double consonant     | To je malo kompliciranno pitanje.                       | To je malo komplicirano pitanje.                       | Spelling         |
| Spacing              | Neznam što bih rekao.                                   | Ne znam što bih rekao.                                 | Spelling         |
| Misplaced letters    | Danas imamo važnu prezenatciju.                         | Danas imamo važnu prezentaciju.                        | Spelling         |
| Missing vowel        | Trebamo organizrati sastanak sutra.                     | Trebamo organizirati sastanak sutra.                   | Spelling         |
| Misplaced consonant  | Zaboravio sam svoj kišobran, totalno sam ga zaboravijo. | Zaboravio sam svoj kišobran, totalno sam ga zaboravio. | Spelling         |
| Missing diacritic: č | Zaboravio sam uzeti novcanik iz auta.                   | Zaboravio sam uzeti novčanik iz auta.                  | Spelling         |
| Wrong suffix         | Njegov je otac poznati arhiteckt.                       | Njegov je otac poznati arhitekt.                       | Spelling         |
| Confusion: č/ć       | Ovdje je predivno, osječam se odlično.                  | Ovdje je predivno, osjećam se odlično.                 | Spelling         |
| Confusion: z/ž       | Pošalji mi emajl čim mozeš.                             | Pošalji mi emajl čim možeš.                            | Spelling         |


# Czech

| Type                  | Erroneous sentence                  | Correct sentence                    | General category |
| --------------------- | ----------------------------------- | ----------------------------------- | ---------------- |
| Double consonant      | To je neuvěřitelnně dobré.          | To je neuvěřitelně dobré.           | Spelling         |
| Missing diacritic: í  | To je velmi kreativni řešení.       | To je velmi kreativní řešení.       | Spelling         |
| Double vowel          | To byl maalý rozdíl v ceně.         | To byl malý rozdíl v ceně.          | Spelling         |
| Adjacent-key typo     | Ten projekt bude mít veliký dopas.  | Ten projekt bude mít veliký dopad.  | Spelling         |
| Spacing               | Tobylo úplně nesmyslné rozhodnutí.  | To bylo úplně nesmyslné rozhodnutí. | Spelling         |
| Wrong vowel in suffix | Zabývám se automatizací v prumyslu. | Zabývám se automatizací v průmyslu. | Spelling         |
| Missing consonant     | Vráili jsme se z hor.               | Vrátili jsme se z hor.              | Spelling         |
| Wrong vowel           | V pokoji byly dvě isoby.            | V pokoji byly dvě osoby.            | Spelling         |
| Double ‘s’            | To je úplně normální ssituace.      | To je úplně normální ssituace.      | Spelling         |


# Style check

Style check detects profane, noninclusive, dialectal, and other potentially problematic language in text. It is built into WProofreader and enabled by default for all users.

Matched text is highlighted with a yellow underline. When a user selects the highlighted text, they see replacement suggestions and a description if available.

Style check is available across all WProofreader-based products and SCAYT. Admins can extend the style checking capabilities by creating custom rules with the style guide builder. For details, see [Style guide overview](/v6.10.0.0/features/style-guide-builder).

### Managing style check

Users can show or hide style suggestions through the product UI by toggling the **Style** option. This setting is per-user and doesn't affect other users under the same subscription.

Admins can also control style check for all users:

* Disable specific rule categories or individual rules.
* Hide style suggestions by default while still allowing users to re-enable them through the **Style** toggle.
* Turn off style suggestions completely so users can't re-enable them through the **Style** toggle.

For detailed configuration instructions, refer to the WProofreader [options reference](https://webspellchecker.com/docs/api/wscbundle/Options.html).

### Built-in rule categories

The following rule categories ship with WProofreader. They are maintained by WebSpellChecker and cover multiple languages.

#### All languages

| Category ID               | Description                                                                                             | Example patterns      | Example message                                                             |
| ------------------------- | ------------------------------------------------------------------------------------------------------- | --------------------- | --------------------------------------------------------------------------- |
| `WSC_UKRAINIAN_GEO_NAMES` | Flags outdated transliterations of Ukrainian geographic names and suggests official Ukrainian versions. | Lvov, L'viv, Donets'k | Consider using the official Ukrainian transliteration for geographic names. |

#### English

| Category ID                         | Description                                                                                              | Example patterns      | Example message                                                          |
| ----------------------------------- | -------------------------------------------------------------------------------------------------------- | --------------------- | ------------------------------------------------------------------------ |
| `WSC_RACE_AND_ETHNICITY_INSULTS`    | Flags words referencing ethnicity or race that may be considered inappropriate or offensive.             | redskin, mulattos     | Probably offensive language.                                             |
| `WSC_GENDERED_AND_ABLEIST_LANGUAGE` | Flags words or phrases that may be considered discriminating against gender or people with disabilities. | Welshmen, trash man   | Probably noninclusive language. Consider unbiased alternative.           |
| `WSC_LGBTQIA_INCLUSIVE_LANGUAGE`    | Flags language that may appear noninclusive or biased toward LGBTQIA+ individuals.                       | his husband           | Probably noninclusive language. Consider unbiased alternatives.          |
| `WSC_STRONG_SWEAR_LANGUAGE`         | Flags swear words recommended to be avoided due to their potential to offend or appear unprofessional.   | darkie, nigga         | Probably offensive language.                                             |
| `WSC_TALL_MAN_LETTERING`            | Flags drug names that the FDA has identified as easily confused. Suggests Tall Man lettering format.     | oxybutynin, glipizide | Consider using Tall Man lettering to differentiate lookalike drug names. |
| `WSC_DISABILITY_INCLUSIVE_LANGUAGE` | Flags language that may appear noninclusive or biased toward people with disabilities.                   | feeble-minded         | Probably noninclusive language. Consider unbiased alternatives.          |
| `WSC_SLUR_LANGUAGE`\*               | Flags words that may be interpreted as offensive or insulting.                                           | gypo, loser           | Probably offensive language.                                             |
| `WSC_VIOLENCE_MORTALITY`\*          | Flags words connected to sensitive topics like violence or mortality.                                    | kill, hate            | Potentially abusive or violent language.                                 |

\*Disabled by default. Used only for content filtering purposes.

#### German

| Category ID                      | Description                                                                                            | Example patterns        | Example message                                                                              |
| -------------------------------- | ------------------------------------------------------------------------------------------------------ | ----------------------- | -------------------------------------------------------------------------------------------- |
| `WSC_STRONG_SWEAR_LANGUAGE`      | Flags swear words recommended to be avoided due to their potential to offend or appear unprofessional. | Massenwichser, Mondkalb | Eventuell beleidigende Sprache.                                                              |
| `WSC_RACE_AND_ETHNICITY_INSULTS` | Flags words referencing ethnicity or race that may be considered inappropriate or offensive.           | N-Wort, Judenleim       | Eventuell beleidigende Sprache.                                                              |
| `WSC_ANGLICISM_AND_ALTERNATIVE`  | Flags established English loanwords in German and suggests suitable German alternatives.               | Link, Outsourcing       | Dieser englische Begriff ist geläufig, aber es gibt auch eine passende deutsche Alternative. |
| `WSC_FOREIGN_WORDS`              | Flags English words not yet established as loanwords and suggests German equivalents.                  | mindfulness, sign-in    | Verwenden Sie die etablierte deutsche Entsprechung für Klarheit und Sprachreinheit.          |

#### Spanish

| Category ID                      | Description                                                                                            | Example patterns   | Example message                                                                          |
| -------------------------------- | ------------------------------------------------------------------------------------------------------ | ------------------ | ---------------------------------------------------------------------------------------- |
| `WSC_STRONG_SWEAR_LANGUAGE`      | Flags swear words recommended to be avoided due to their potential to offend or appear unprofessional. | col blanca, culo   | Lenguaje posiblemente ofensivo.                                                          |
| `WSC_RACE_AND_ETHNICITY_INSULTS` | Flags words referencing ethnicity or race that may be considered inappropriate or offensive.           | negroide, bachicha | Lenguaje posiblemente ofensivo.                                                          |
| `WSC_ANGLICISM_AND_ALTERNATIVE`  | Flags established English loanwords in Spanish and suggests suitable Spanish alternatives.             | fitness, feedback  | Este término en inglés es común, pero también existe una alternativa oficial en español. |
| `WSC_FOREIGN_WORDS`              | Flags English words not yet established as loanwords and suggests Spanish equivalents.                 | delivery, meeting  | Valora emplear términos en español en vez de extranjerismos.                             |

#### French (France)

| Category ID                      | Description                                                                                            | Example patterns   | Example message                                                                                |
| -------------------------------- | ------------------------------------------------------------------------------------------------------ | ------------------ | ---------------------------------------------------------------------------------------------- |
| `WSC_STRONG_SWEAR_LANGUAGE`      | Flags swear words recommended to be avoided due to their potential to offend or appear unprofessional. | salopard, enfoiré  | Langage potentiellement offensant.                                                             |
| `WSC_RACE_AND_ETHNICITY_INSULTS` | Flags words referencing ethnicity or race that may be considered inappropriate or offensive.           | cafre, macaroni    | Langage potentiellement offensant.                                                             |
| `WSC_ANGLICISM_AND_ALTERNATIVE`  | Flags established English loanwords in French (France) and suggests suitable French alternatives.      | fast food, spoiler | Ce terme anglais est courant, mais il existe également une alternative officielle en français. |
| `WSC_FOREIGN_WORDS`              | Flags English words not yet established as loanwords and suggests French equivalents.                  | backup, browser    | Utilisez des mots français établis pour plus de clarté et de compréhension.                    |

#### French (Canada)

| Category ID                      | Description                                                                                            | Example patterns  | Example message                                                                                     |
| -------------------------------- | ------------------------------------------------------------------------------------------------------ | ----------------- | --------------------------------------------------------------------------------------------------- |
| `WSC_STRONG_SWEAR_LANGUAGE`      | Flags swear words recommended to be avoided due to their potential to offend or appear unprofessional. | salopard, enfoiré | Langage potentiellement offensant.                                                                  |
| `WSC_RACE_AND_ETHNICITY_INSULTS` | Flags words referencing ethnicity or race that may be considered inappropriate or offensive.           | cafre, macaroni   | Langage potentiellement offensant.                                                                  |
| `WSC_ANGLICISM_AND_ALTERNATIVE`  | Flags established English loanwords in French (Canada) and suggests suitable French alternatives.      | marketing         | Ce terme anglais est courant, mais il existe aussi une alternative officielle en français canadien. |
| `WSC_FOREIGN_WORDS`              | Flags English words not yet established as loanwords and suggests French Canadian equivalents.         | app, outfit       | Utilisez des mots français canadiens établis pour plus de clarté et de compréhension.               |

#### Portuguese

| Category ID                     | Description                                                                                      | Example patterns | Example message                                                                     |
| ------------------------------- | ------------------------------------------------------------------------------------------------ | ---------------- | ----------------------------------------------------------------------------------- |
| `WSC_ANGLICISM_AND_ALTERNATIVE` | Flags established English loanwords in Portuguese and suggests suitable Portuguese alternatives. | cool             | Este termo inglês é comum, mas também existe uma alternativa adequada em português. |
| `WSC_FOREIGN_WORDS`             | Flags English words not yet established as loanwords and suggests Portuguese equivalents.        | fan, networking  | Considere utilizar termos em português em vez de palavras estrangeiras.             |

#### Ukrainian

| Category ID                     | Description                                                                                            | Example patterns | Example message                                                      |
| ------------------------------- | ------------------------------------------------------------------------------------------------------ | ---------------- | -------------------------------------------------------------------- |
| `WSC_STRONG_SWEAR_LANGUAGE`     | Flags swear words recommended to be avoided due to their potential to offend or appear unprofessional. | дідько, йолоп    | Ймовірно, образлива мова.                                            |
| `WSC_ANTYSURZHYK`               | Flags Russian borrowings and provides Ukrainian equivalents to maintain linguistic purity.             | катишки, шпіон   | Не використовуйте мовні запозичення з російської мови.               |
| `WSC_ANGLICISMS`                | Flags English words not yet established as loanwords and suggests Ukrainian equivalents.               | таба, сорі       | Спробуйте використовувати українські терміни замість іноземних слів. |
| `WSC_ANATOMY_SENSITIVE_TERMS`\* | Flags words connected to sensitive anatomical topics.                                                  | лобковий         | Цей термін або фраза може звучати образливо в цьому контексті.       |

{% hint style="info" %}
\*Disabled by default. Used only for content filtering purposes.
{% endhint %}

#### Italian

| Category ID                      | Description                                                                                                                     | Example patterns  | Example message                        |
| -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- | ----------------- | -------------------------------------- |
| `WSC_BLASPHEMY`                  | Flags words or phrases that insult the name of God, Jesus, Mary, the Saints, or sacred things. Also used for content filtering. | porco il cristo   | Probabilmente un linguaggio offensivo. |
| `WSC_STRONG_SWEAR_LANGUAGE`      | Flags swear words recommended to be avoided due to their potential to offend or appear unprofessional.                          | figlio di puttana | Probabilmente un linguaggio offensivo. |
| `WSC_RACE_AND_ETHNICITY_INSULTS` | Flags words referencing ethnicity or race that may be considered inappropriate or offensive.                                    | crucco            | Probabilmente un linguaggio offensivo. |

<br>


# Text autocomplete

### Overview <a href="#autocompletesuggestions-overview" id="autocompletesuggestions-overview"></a>

**Text autocomplete suggestions** was rolled out as a part of the WebSpellChecker[ v5.19.0 release](https://webspellchecker.com/release-notes/v5-19-0/). The feature automatically completes the user’s thought by suggesting the next word or a short phrase based on the context.

The functionality is implemented and added to WProofreader-based products (on-premises and cloud versions) in the **turned OFF state**. In the [WProofreader browser extension](https://wproofreader.com/), the feature is enabled by default.

Autocomplete suggestions while typing are available only for English dialects (en\_AU, en\_CA, en\_GB, en\_NZ, en\_US, en\_ZA) for now.

Developers can update the configuration and turn ON the autocomplete by default for all users. Also, there is a toggle setting on the UI allowing end-users to enable or disable text prediction.

<figure><img src="/files/aH0V5hE4jCY8o33jVUWO" alt=""><figcaption></figcaption></figure>

### Autocomplete mechanism <a href="#autocompletesuggestions-autocompletemechanism" id="autocompletesuggestions-autocompletemechanism"></a>

Autocomplete is based on the GPT2 (small) model pre-trained on a very large corpus of English data.

The autocomplete suggests the next word or a short phrase based on the context. For example, if the user writes “thank”, the autocomplete suggests “you”. Autocomplete suggestions are **highlighted in gray**. To accept the suggestion, the user clicks the right arrow key **→** or **Tab**. To ignore/refuse the suggestion, the user should continue writing. To “undo” the autocomplete suggestion, the user should use the native revert mechanism of the browser or editor (for instance, click Ctrl+Z).

The functionality is disabled for **input** fields and **tables** due to the lack of space to show autocomplete suggestions. The feature works in **textareas** if the cursor is at the end of the text.

The user is typing a space, and after **0ms**, the request for the autocomplete command is sent. If the text is smaller or equals 200 characters, then the request includes the whole text. If the text is larger than 200 characters, then the autocomplete request includes only the last 200 characters. If the text is too large, it will be limited to 64 tokens on the server/network side.

#### Configuration <a href="#autocompletesuggestions-configuration" id="autocompletesuggestions-configuration"></a>

Admins can enable autocomplete by adding **autocomplete: true**, option to WEBSPELLCHECKER\_CONFIG. End users will still have an option to disable autocomplete suggestions from the UI of the Settings dialog.

```javascript
<script>
    window.WEBSPELLCHECKER_CONFIG = {
        ...
        autocomplete: true,
        ...
    }
</script>
```

Admins can hide the autocomplete section from the settings, so users can’t enable or disable this feature by removing the '**general'** value from the **settingsSections** option. Please note that in this case the option to enable/disable **Spelling autocorrect** won’t be available either.

```javascript
<script>
    window.WEBSPELLCHECKER_CONFIG = {
        ...
   		settingsSections: ['dictionaries', 'languages', 'general', 'options'],
        ...
    }
</script>
```

<figure><img src="/files/C91XNDa2vCKlBenHp7fD" alt=""><figcaption></figcaption></figure>

This option and all other options for WProofreader are available in the [WProofreader API options](https://webspellchecker.com/docs/api/wscbundle/Options.html).\ <br>


# Style guide builder

The style guide builder lets admins create custom rules that flag specific text patterns and optionally suggest replacements. This is useful for enforcing organization-specific terminology, brand names, or writing conventions.

Custom rules appear the same way as built-in style check rules to end users: matched text is highlighted with a yellow underline, with replacement suggestions and a description shown on selection. Custom rules always take priority over built-in style rules.

The style guide builder is available for admins under paid Cloud and self-hosted plans.

### How custom rules work

Custom rules are added to the common category, meaning they aren't tied to a specific language and apply regardless of the language being checked. Support for language-specific rule sets is coming soon.

Each custom rule consists of the following parts:

* **Patterns** (required). The text to flag. Up to 3 per rule.
* **Suggestions** (optional). Replacement text offered to users. Up to 3 per rule. Required if no description is provided.
* **Description** (optional). An explanation shown to users. Max 200 characters. Required if no suggestions are provided.
* **Context awareness** (optional). Controls when the rule applies based on surrounding text. **Include in context** activates the rule only when at least one of the specified entries appears in the same sentence as the pattern. **Exclude from context** skips the rule when any of the specified entries is present. Up to 3 entries each.

To create language-specific rules, use the [Style guide API](/v6.10.0.0/api-reference/style-guide-api) with the `lang` parameter.

Both custom rules and built-in style check rules are managed by users through the **Style** toggle in the product UI, and by admins through client-side configuration options. For details on available options, see [Style check](/v6.10.0.0/features/style-check).

#### Case sensitivity

How case sensitivity works depends on the casing of your pattern.

If the pattern is entirely lowercase, it matches the same text in any case, and the suggestion adjusts to match:

| Case        | Pattern | Suggestion                         |
| ----------- | ------- | ---------------------------------- |
| Lowercase   | exampl1 | exampl2                            |
| Capitalized | Exampl1 | Exampl2                            |
| Uppercase   | EXAMPL1 | EXAMPL2                            |
| Mixed       | ExaMPl1 | exampl2 (original suggestion case) |

If the pattern or suggestion contains any non-lowercase characters, both stay in their original case regardless of how the matched text appears:

| Case        | Pattern | Suggestion |
| ----------- | ------- | ---------- |
| Lowercase   | exampl5 | ExaPl6     |
| Capitalized | Exampl5 | ExaPl6     |
| Uppercase   | EXAMPL5 | ExaPl6     |
| Mixed       | ExaMPl5 | ExaPl6     |

### Managing custom rules

How you manage custom rules depends on your setup:

* **Cloud.** Use the style guide builder in the admin panel at [app.wproofreader.com](https://app.wproofreader.com). See Style guide: Cloud admin panel →.
* **Self-hosted.** Work with style guide files directly. See [Style guide: Self-hosted](/v6.10.0.0/features/style-guide-builder/style-guide-self-hosted).
* **API.** Use the style guide HTTP API to create, edit, delete, and list rules programmatically. See [Style guide API](/v6.10.0.0/api-reference/style-guide-api).

### Limitations

* Up to 2,000 custom rules per subscription (Cloud) or per language file (self-hosted). Contact WebSpellChecker if you need more.
* The following characters can't be used in rule patterns, suggestions, or context fields: `# ; [ ] < > { }`. The description field allows `;` but restricts the rest.
* Each field (patterns, suggestions, context\_include, context\_exclude) has a maximum combined length of 150 Unicode characters. Descriptions can be up to 200 characters.


# Style guide: Cloud admin panel

This guide covers how to manage custom style guide rules through the admin panel at [app.wproofreader.com](https://app.wproofreader.com).

Rules created through the admin panel are added to the common category, meaning they are language-independent and apply regardless of the language being checked. Support for language-specific rule sets is coming soon.

For an overview of the style guide feature, custom rules structure, case sensitivity, and limitations, refer to the [Style guide overview →](/v6.10.0.0/features/style-guide-builder).

### Accessing the style guide builder

1. Sign in at [app.wproofreader.com](https://app.wproofreader.com).
2. In the left navigation panel, select **Style guide**.
3. If you already have rules, you'll see them listed with the following columns: Patterns, Suggestions, Description, and Status. Otherwise, the list will be empty.

You can use the **Search for pattern...** field to find specific rules. Search scans the Patterns column only and is case-insensitive.

### Adding a rule

1. Click **New rule**.
2. Fill in the following fields:
   * **Patterns.** The exact word or phrase to be flagged. Click **Add new** to add up to 3 patterns per rule. This field is required.
   * **Suggestions.** The replacement text to offer users. Click **Add new** to add up to 3 suggestions per rule. Optional if a description is provided.
   * **Description.** An explanation shown to users alongside the suggestion. Max 200 characters. Optional if at least one suggestion is provided.
3. Optionally, configure **Context awareness** to control when the rule applies:
   * **Include in context.** The rule only activates when at least one of these entries appears in the same sentence as the pattern. Up to 3 entries.
   * **Exclude from context.** The rule is skipped when any of these entries appears in the same sentence. Up to 3 entries.
4. Click **Save**.

Once saved, the rule takes effect after synchronization. Whenever a user types text matching one of the patterns, it will be highlighted with a yellow underline and the configured suggestions and description will appear.

For example, if you create a rule with the pattern "WSC", the suggestion "WebSpellChecker", and the description "Use the full company name.", whenever a user types "WSC" in their text, it will be underlined with a yellow line. Clicking the underlined word shows the description and the suggested replacement.

### Editing a rule

1. Find the rule in the list. Use the search field if you have many rules.
2. Click on the rule row to open the rule editor dialog.
3. Make your changes and click **Save**.

### Importing rules in bulk

Click **Import rules** to upload a CSV file containing multiple rules. The file must meet the following requirements:

* CSV format with five columns: Patterns, Suggestions, Description, Context include, and Context exclude. The first row must contain these column headers.
* The file must not exceed 5 MB.
* Maximum of 2,000 rules.

If a rule has multiple patterns or suggestions, separate them with a semicolon (`;`). Context include and Context exclude values are also separated by semicolons. To import a rule in a disabled state, add `#` before the first pattern value.

Example CSV content:

```
Patterns,Suggestions,Description,Context include,Context exclude
WSC,WebSpellChecker,Use the full company name instead.,product,
marketing team,Marketing team,Use capitalization for official department names.,company;our,external
```

You can prepare this file in Google Sheets or similar software. Make sure the first row contains the column headers, then export as CSV (File > Download > Comma Separated Values).

### Downloading rules

Click **Download** to export all current rules as a file. This is useful as a backup before importing new rules or for editing rules in bulk using a spreadsheet application.

### Enabling or disabling a rule

Toggle the **Status** switch in the rule list row. Disabled rules aren't applied during spell check but aren't deleted. They can be re-enabled at any time.

### Deleting a rule

Click the trash icon in the rule list row. The rule is deleted immediately without a confirmation prompt, so make sure you want to remove it before clicking.

If you only need to temporarily stop a rule from being applied, consider disabling it instead of deleting it.

### FAQ

#### Why don't my style guide changes take effect immediately?

Changes to style guide rules require a short time to synchronize. Currently, synchronization can take up to 3 minutes. This is a temporary limitation that WebSpellChecker is working to improve.

#### What's the difference between built-in style check rules and custom rules?

Built-in style check rules are predefined categories (profanity, inclusive language, etc.) maintained by WebSpellChecker and enabled by default for all users. Custom rules are the ones you create through the style guide builder to enforce your organization's specific writing standards. Both appear to end users in the same way, as yellow-underlined text with suggestions. Custom rules always take priority over built-in ones. For details on built-in categories, see Style check →.

#### Can I scope custom rules to specific languages?

The admin panel currently creates rules in the common category, meaning they apply regardless of language. To create language-specific rules, use the Style guide API → with the `lang` parameter.

#### Can I use context awareness to make rules more precise?

Yes. When adding or editing a rule, you can use the **Include in context** and **Exclude from context** fields to control when a rule triggers. For example, you could create a rule that flags "*lead*" only when "paint" appears in the same sentence by adding "*paint*" as an include context entry. This helps avoid false positives for ambiguous patterns.

#### What file format does the import accept?

The import accepts CSV files only. The file must have five columns (Patterns, Suggestions, Description, Context include, Context exclude) with headers in the first row, and must not exceed 5 MB.

#### Can I import rules with context awareness settings?

Yes. The CSV import supports context awareness through the Context include and Context exclude columns.


# Style guide: Self-hosted

This guide covers how to manage custom style guide rules for self-hosted WProofreader installations by working with CSV files directly. For an overview of the style guide feature, custom rules structure, case sensitivity, and limitations, refer to the [Style guide overview →](/v6.10.0.0/features/style-guide-builder).

### File structure

Custom style guide rules are stored as CSV files in the `StyleGuide/client` directory inside your WProofreader installation path:

```
<WProofreader_Installation_Path>/AppServer/StyleGuide/client/
```

Rules are organized by language. Each language has its own folder named after its language alias (as defined in your `AppServerX.xml` file). For example, `en` applies rules to all English dialects, while `en_GB` applies only to British English. Use `common` for rules that apply regardless of language.

Example folder structure:

```
StyleGuide/
└── client/
    ├── common/
    │   └── brandname_terminology.csv
    ├── en/
    │   └── myorg_writing_style.csv
    ├── en_GB/
    │   └── myorg_british_spelling.csv
    └── de/
        └── myorg_writing_style.csv
```

All changes inside `StyleGuide/client` are applied automatically without restarting the WProofreader application.

### File naming

The CSV file name defines the namespace and category for the rules it contains. It consists of two parts separated by the first underscore (`_`):

* The text before the first underscore is the **namespace** (prefix) for all rules and categories in the file. This is typically your company or organization name.
* The text after the first underscore is the **category name** for the rule set. Categories are logical groupings of rules. The category name can contain additional underscores.

For example, the file `myorg_writing_style.csv` creates rules under the namespace `myorg` in the category `writing_style`.

Use descriptive file names that clearly indicate the purpose of the rules. Organize rules by scope (common vs. language-specific).

#### Multi-language categories

Custom rule categories can span multiple languages. Files with the same name in different language folders belong to the same category. For example:

```
StyleGuide/client/en/mycompany_example.csv
StyleGuide/client/de/mycompany_example.csv
```

These add rules to the same category in English and German respectively. Keep in mind that disabling a category applies to all languages it's defined for.

### CSV file format

Each CSV file must have a header row with the following columns: Patterns, Suggestions, Description, Context include, and Context exclude.

```
Patterns,Suggestions,Description,Context include,Context exclude
WSC,WebSpellChecker,Use the full company name instead.,product,
marketing team,Marketing team,Use capitalization for official department names.,company;our,external
```

Rules follow these formatting conventions:

* If a rule has multiple patterns or suggestions, separate them with a semicolon (`;`).
* Context include and Context exclude values are also separated by semicolons.
* The Description, Context include, and Context exclude columns can be left empty.
* To disable a rule, add `#` before the first pattern value in the row.

#### File requirements

* CSV format only.
* The file must not exceed 5 MB.
* Maximum of 2,000 rules per file.

### Creating custom rules

1. Navigate to the StyleGuide directory in your WProofreader installation path: `<WProofreader_Installation_Path>/AppServer/StyleGuide`
2. Inside the `client` folder, create a folder for the target language (e.g. `en` for English, `de` for German). Use the language alias from your `AppServerX.xml` file. If there are two aliases for a language, you can use either one. For language-independent rules, use the `common` folder.
3. Create a CSV file inside the language folder following the naming conventions and format described above.

For example, to create English-specific rules for your organization:

```
<WProofreader_Installation_Path>/AppServer/StyleGuide/client/en/myorg_writing_style.csv
```

The rules take effect automatically after the file is saved.

### Editing and deleting rules

Open the CSV file in a text editor or spreadsheet application, make your changes, and save. Changes are picked up automatically.

To delete an entire rule set, remove the CSV file from the language folder.

To temporarily disable a single rule without removing it, add `#` before the pattern value in that row.

### Limits and behavior

#### File size limit

* If a file exceeds 5 MB when the WProofreader application starts, it isn't loaded.
* If a file exceeds 5 MB at runtime (e.g. after editing), the rules in that file aren't updated internally. The previously loaded version of the rules continues to work. The file isn't reloaded until its size is back within the limit.

#### File count limit

* Maximum of 50 files per language folder.
* If there are more than 50 files in a language folder when the WProofreader application starts, none of the files in that folder are loaded.
* If files are added during runtime and the total exceeds 50, the new files aren't used until the count drops to 50 or fewer. Files that were already loaded continue to work, and edits to those files are still applied.

### FAQ

#### Do I need to restart AppServer after changing rules?

No. All changes inside `StyleGuide/client` are applied automatically.

#### Can I use the same category across multiple languages?

Yes. Create files with the same name in different language folders (e.g. `en/myorg_example.csv` and `de/myorg_example.csv`). Disabling the category will disable it for all languages.

#### What happens if my CSV file has errors?

If the file can't be parsed (e.g. malformed CSV), the rules from that file won't be loaded. Check the file format and ensure it follows the column structure described above.


# OLD Style guide builder

{% hint style="info" %}
The style guide functionality was introduced in v5.29.0. It is now available to all paid users. Users with a self-hosted product version can create and manage their company style guides, including custom categories and rules. Other paid users can currently create and manage custom style guide rules through an API or admin panel.

In addition, all users have access to a predefined set of rules built on top of the style guide functionality. These rules support inclusive, respectful, and authentic language checks across multiple languages.
{% endhint %}

**Key features:**

1. Custom rules: With the Style Guide functionality, all paid users can create and manage their own linguistic rules and patterns. This ensures smooth and precise communication tailored to specific business requirements.
2. Custom categories: Users with a self-hosted product version can create and organize custom categories, enabling more advanced structuring of their company style guide.
3. Style check (predefined rule lists): We provide predefined sets of rules to address non-inclusive, profane, and non-authentic writing. These comprehensive rule sets help maintain a professional and respectful tone across written content. Users can control how detected issues are displayed directly from the UI, in line with the Style Guide rules.

This new feature is available for WProofreader for RTEs, the plugin for CKEditor 5, Web API, and the browser extension.

* [1. How to configure Custom guide functionality?](#styleguidefunctionalityv.1-or-release5.29.0.0-1.howtoconfigurecustomguidefunctionality)
  * [1.1. Managing Custom guide functionality state for on-premise version 5.29.0.0+ via AppServerX.xml file (back-end)](#styleguidefunctionalityv.1-or-release5.29.0.0-1.1.managingcustomguidefunctionalitystateforon-premise)
  * [1.2. Managing rules statuses for on-premise version 5.29.0.0+ via disabledRules.json file (back-end)](#styleguidefunctionalityv.1-or-release5.29.0.0-1.2.managingrulesstatusesforon-premiseversion5.29.0.0+)
  * [1.3. Disabling specific rules or rules categories for cloud and on-premise version v.5.29.0.0 (client-side)](#styleguidefunctionalityv.1-or-release5.29.0.0-1.3.disablingspecificrulesorrulescategoriesforcloudand)
  * [1.4. Using Web API to manage style guide feature for cloud and on-premise version v.5.29.0.0](#styleguidefunctionalityv.1-or-release5.29.0.0-1.4.usingwebapitomanagestyleguidefeatureforcloudandon)
* [2. Creating custom rules for on-premise clients v.5.29.0.0+](#styleguidefunctionalityv.1-or-release5.29.0.0-2.creatingcustomrulesforon-premiseclientsv.5.29.0.0+)
  * [2.1. Limits and requirements](/v6.10.0.0/faq/technical/caching/can-we-control-the-cache-limit-is-it-configurable)
  * [2.2. How to create custom rules?](#styleguidefunctionalityv.1-or-release5.29.0.0-2.2.howtocreatecustomrules)

## **1. How to configure Custom guide functionality?** <a href="#styleguidefunctionalityv.1-or-release5.29.0.0-1.howtoconfigurecustomguidefunctionality" id="styleguidefunctionalityv.1-or-release5.29.0.0-1.howtoconfigurecustomguidefunctionality"></a>

Cloud users have their text verified against a predefined set of WebSpellChecker-provided rules, which can be enabled or disabled individually or as a group. In addition, all paid users can create and manage custom style guide rules, currently available via API or the admin panel.

Users with a self-hosted version have extended capabilities, including full control over their Style Guide setup, with the ability to create and organize both custom rules and categories.

### **1.1. Managing Custom guide functionality state for on-premises version 5.29.0.0+ via AppServerX.xml file (back-end)** <a href="#styleguidefunctionalityv.1-or-release5.29.0.0-1.1.managingcustomguidefunctionalitystateforon-premise" id="styleguidefunctionalityv.1-or-release5.29.0.0-1.1.managingcustomguidefunctionalitystateforon-premise"></a>

Style Guide functionality is enabled by default. The found mistakes are highlighted with the yellow lines starting v.5.29.1.0. The folder with appropriate files for on-premises clients is located in the core AppServer directory:

**\<Installation\_Path>\WebSpellChecker\AppServer\StyleGuide**

Starting with WebSpellChecker standalone version 5.29.0.0 you can manage the state of the Style Guide functionality follow the steps below:

1. Locate and open the **AppServerX.xml** configuration file for editing. By default, the file is located in \<Installation\_Path>/AppServer/AppServerX.xml.
2. Before making any changes to the AppServerX.xml file, it is recommended to [stop AppServer](https://docs.webspellchecker.net/display/WebSpellCheckerServer55x/Main+AppServer+Commands#MainAppServerCommands-stopAppServerWindowsLinux2.StopAppServer).
3. Find a block with the needed language by language name or its shortcode. For example, American English

```
<StyleGuideCheck Enabled = “true”>
   <DirectoryPath>StyleGuide</DirectoryPath>
</StyleGuideCheck>
```

4\. Change the value for **Enabled** state from true to **false**.

5\. Save the updated version of the **AppServerX.xml** file and [start AppServer](https://docs.webspellchecker.net/display/WebSpellCheckerServer55x/Main+AppServer+commands#MainAppServercommands-startAppServerWindowsLinux1.StartAppServer) to apply changes.

If you run WebSpellChecker on Docker, you can [create an updated image from a modified Docker container](https://github.com/WebSpellChecker/wproofreader-docker) to use it further.

### **1.2. Managing rules statuses for standalone version 5.29.0.0+ via disabledRules.json file (back-end)** <a href="#styleguidefunctionalityv.1-or-release5.29.0.0-1.2.managingrulesstatusesforon-premiseversion5.29.0.0" id="styleguidefunctionalityv.1-or-release5.29.0.0-1.2.managingrulesstatusesforon-premiseversion5.29.0.0"></a>

The WebSpellChecker on-premises clients with access to the internal software configuration can disable a particular Style Guide or grammar rule by using the ‘**disabledRules.json**’ configuration file, which is located by default in the root installation directory **\<Installation\_Path>\WebSpellChecker\AppServer**

This is a regular JSON file (with comments supported) with two array values: ‘categories’ and ‘rules’, for the lists of category and rule IDs, respectively.

{% code title="disabledRules.json" %}

```json
{
  "categories": [
//    "WSC_CATEGORY_NAME",
//    "COMPANY_CATEGORY_NAME"
  ],

  "rules": [
//    "WSC_1234567890",
    "DATE_NEW_YEAR",
    "OXFORD_SPELLING_NOUNS",
    "OXFORD_SPELLING_ISE_VERBS",
    "OXFORD_SPELLING_ADJECTIVES",
    "OXFORD_SPELLING_ADVERBS",
    "OXFORD_SPELLING_Z_NOT_S",
    "OXFORD_SPELLING_GRAM"
  ]
}
```

{% endcode %}

As for the built-in ones, we have **several categories** of custom rules

* English: WSC\_GENDERED\_AND\_ABLEIST\_LANGUAGE, WSC\_RACE\_AND\_ETHNICITY\_INSULTS, WSC\_STRONG\_SWEAR\_LANGUAGE
* German: WSC\_FOREIGN\_WORDS WSC\_RACE\_AND\_ETHNICITY\_INSULTS WSC\_STRONG\_SWEAR\_LANGUAGE WSC\_ANGLICISM\_AND\_ALTERNATIVE
* Spanish: WSC\_RACE\_AND\_ETHNICITY\_INSULTS WSC\_STRONG\_SWEAR\_LANGUAGE WSC\_FOREIGN\_WORDS WSC\_ANGLICISM\_AND\_ALTERNATIVE
* French/ Canadian French: WSC\_RACE\_AND\_ETHNICITY\_INSULTS WSC\_STRONG\_SWEAR\_LANGUAGE WSC\_FOREIGN\_WORDS WSC\_ANGLICISM\_AND\_ALTERNATIVE
* Portuguese: WSC\_RACE\_AND\_ETHNICITY\_INSULTS WSC\_STRONG\_SWEAR\_LANGUAGE WSC\_FOREIGN\_WORDS WSC\_ANGLICISM\_AND\_ALTERNATIVE
* Ukrainian: WSC\_ANTYSURZHYK WSC\_STRONG\_SWEAR\_LANGUAGE WSC\_ANGLICISMS
* Italian: WSC\_BLASPHEMY WSC\_STRONG\_SWEAR\_LANGUAGE WSC\_RACE\_AND\_ETHNICITY\_INSULTS
* Dutch: WSC\_BLASPHEMY WSC\_STRONG\_SWEAR\_LANGUAGE WSC\_RACE\_AND\_ETHNICITY\_INSULTS

For custom rules that can be created by the on-premises clients, the category IDs are the file names UPPERCASED with no extension.

Whereas a **rule ID** is a unique identifier generated by the server automatically at the time the file is read. It can be learned from the Web API response as ‘**rule**’ or via browser’s development tools, specifically, inspect element under the ‘[**data-grammar-rule**](https://docs.webspellchecker.com/display/WebSpellCheckerCloud/How+to+disable+a+certain+grammar+rule+or+rule+category+for+all+users)**’**. It will have the following format: PREFIX +underscore(\_) + up to 20-digit number based on the rule’s pattern. Here is the example of rule ID from the JSON response: "WSC\_2664667314028094467".

![](/files/kyHImzyTc3kVffiIt390)

Also, in the ‘**disabledRules.json**’ file you can find a list of style rules that disabled by default following the feedback of our customers.

### **1.3. Disabling specific rules or rules categories for cloud and standalone version v.5.29.0.0 (client-side)** <a href="#styleguidefunctionalityv.1-or-release5.29.0.0-1.3.disablingspecificrulesorrulescategoriesforcloudand" id="styleguidefunctionalityv.1-or-release5.29.0.0-1.3.disablingspecificrulesorrulescategoriesforcloudand"></a>

Also you can disable specific rules or rules categories using the **disabledRules** option on client-side by passing it into your HTML:

```
disabledRules: [‘RULEID’, ‘CATEGORYID”],
```

For example, if you want to disable all rules that are added by default, you have to specify the following:

```
disabledRules: ['WSC_GENDERED_AND_ABLEIST_LANGUAGE','WSC_RACE_AND_ETHNICITY_INSULTS','WSC_STRONG_SWEAR_LANGUAGE']
```

### **1.4. Using Web API to manage style guide feature for cloud and standalone version v.5.29.0.0** <a href="#styleguidefunctionalityv.1-or-release5.29.0.0-1.4.usingwebapitomanagestyleguidefeatureforcloudandon" id="styleguidefunctionalityv.1-or-release5.29.0.0-1.4.usingwebapitomanagestyleguidefeatureforcloudandon"></a>

Starting WebSpellChecker version 5.29.0.0, we introduce a range of powerful enhancements to our Web API. These enhancements apply to both the Cloud and Standalone versions, allowing you to effectively manage style guide functionality, including the ability to disable specific rules and their categories. Here are the three new API parameters at your disposal:

* **disable\_style\_guide=true**. This parameter allows you to completely disable the style guide feature.
* **disabled\_rules=RULE\_ID\_1,RULE\_ID\_1.** With this parameter, you can selectively disable individual rules by providing a comma-separated list of rule IDs. This applies to both style and grammar checks, empowering you to fine-tune the spell checking behavior as per your requirements.
* **disabled\_categories=CATEGORY\_ID\_1,CATEGORY\_ID\_1**. Similarly, this parameter enables you to disable specific rule categories by specifying a comma-separated list of category IDs.

Please refer to our comprehensive manual for a detailed guide on [how to leverage Web API and these parameters effectively](https://docs.webspellchecker.com/pages/viewpage.action?pageId=464879804).

## **2. Creating custom rules for on-premises clients v.5.29.0.0+** <a href="#styleguidefunctionalityv.1-or-release5.29.0.0-2.creatingcustomrulesforon-premiseclientsv.5.29.0.0" id="styleguidefunctionalityv.1-or-release5.29.0.0-2.creatingcustomrulesforon-premiseclientsv.5.29.0.0"></a>

WebSpellChecker’s Style Guide functionality allows on-premises clients to create a set of rules to mark a specific piece of text as a style error and optionally provide a list of replacements along with a descriptive message.

### **2.1. Limits and requirements** <a href="#styleguidefunctionalityv.1-or-release5.29.0.0-2.1.limitsandrequirements" id="styleguidefunctionalityv.1-or-release5.29.0.0-2.1.limitsandrequirements"></a>

#### Limitations

Style guide rules have the following restrictions:

* **Rules per file**: Maximum **2,000** rules per CSV file
* **File size**: Maximum **5 MB** per file
* **File format**: Must be `.csv` format
* **Files per directory**: Maximum **50** files per language directory
* **Forbidden characters**: The following characters are not allowed: `[]` `<>` `{}` `\\n` `\\t` `\\b` `\\r` `\\a` `\\f` `\\v`
* **Semicolon usage**: Semicolon (`;`) is reserved as a separator for multiple patterns/suggestions and cannot be escaped
* **Comma restrictions**: Commas are forbidden in patterns, suggestions and context columns. In descriptions, commas are allowed but the entire description must be enclosed in double quotes (`""`)
* **Pattern requirements**:
  * Patterns cannot be empty in a rule
  * Rules with identical patterns are not allowed
* **Column length limits**:
  * **Patterns**: Maximum 150 characters per rule
  * **Suggestions**: Maximum 150 characters per rule
  * **Description**: Maximum 200 characters per rule
  * **Context to include**: Maximum 150 characters per rule
  * **Context to exclude**: Maximum 150 characters per rule

**Example with comma in** the descriptio&#x6E;**:**

```
Patterns,Suggestions,Description,Context include,Context exclude
login,log in,"Use two words for the verb form, not the noun form.",,
setup,set up,"Use two words for the verb form, not the noun form.",,

```

### Best practices

1. **Use descriptive file names** that clearly indicate the purpose of the rules
2. **Organize rules by scope** (common vs. language-specific)

#### What will happen if you reach some of the mentioned limits? <a href="#styleguidefunctionalityv.1-or-release5.29.0.0-whatwillhappenifyoureachsomeofthementionedlimits" id="styleguidefunctionalityv.1-or-release5.29.0.0-whatwillhappenifyoureachsomeofthementionedlimits"></a>

The behavior for reaching the file size limit is as follows:

* If the file is already larger than the limit when AppServer is booting up, it is not read.
* If it overshot the limit at runtime, rules are not updated internally. Old ones are still used. The file is not reloaded until it’s of an appropriate size.

The behavior for reaching the file number limit is as follows:

* If there are more than 50 files at the start of the server for the language, none are loaded.
* If some number of new files are added during the work of the app, no new files are used, until the total number is 50 or fewer. Old (already loaded) files will continue to work as before. Moreover, their edits will also be readily applied.

### **2.2. How to create custom rules?** <a href="#styleguidefunctionalityv.1-or-release5.29.0.0-2.2.howtocreatecustomrules" id="styleguidefunctionalityv.1-or-release5.29.0.0-2.2.howtocreatecustomrules"></a>

To create a custom rule, on-premises clients have to follow the steps below:

1\. Navigate to the StyleGuide directory: **\<Installation\_Path>\WebSpellChecker\AppServer\StyleGuide**

2\. Create the folder with the name **company**

3\. Navigate inside the **company** folder that is available by default starting v.5.29.1.0, and create another folder with the name that will relate to the **language alias** that you can find in the AppServerX.xml file. For example, **en** for English.

{% hint style="info" %}
If there are two aliases in the AppServerX.xml file, you can use any of them.
{% endhint %}

4\. Create a .csv file inside the created folders following the requirements described above. For example, the \`mycompany\_example.csv\` file inside:

**\<Installation\_Path>\WebSpellChecker\AppServer\StyleGuide\company\en**

{% hint style="info" %}
The file name is meaningful. It consists of two parts:

* The first is the text before the first underscore (\_). It will be used as a “prefix” or “namespace” for all rules and categories you create. Conveniently, it can be the name of your company or organization, or a variation thereof.
* The second part is the rest of the text after the first underscore (which itself can contain other underscores). It stands for a category name for this rule set. Categories are logical groupings of your rules.

Custom rules categories can be multilingual. Thus, files

* StyleGuide/company/en/mycompany\_example.csv
* StyleGuide/company/de/mycompany\_example.csv

will add rules for the same category in two different languages (English and German, respectively). This is important to keep in mind, because when you disable a category, it applies to all the languages it’s defined for.
{% endhint %}

5\. Inside .csv we define rules in the following way:

* Input — Original text (TAB for several instances);
* Output — A substitute for the original text. Can be empty — no substitute;
* Message — Explanation (360 characters).

All the changes inside **StyleGuide/company** are live automatically.

mycompany\_example.csv

```
insurance man;
insurance agent,
Probably non-inclusive language. Choose an inclusive alternative.
```

How it will look like using WProofreader:

![](/files/E5MqII8Ojk2AB8Qjqbj1)

### Still have a question? <a href="#styleguidefunctionalityv.1-or-release5.29.0.0-stillhaveaquestion" id="styleguidefunctionalityv.1-or-release5.29.0.0-stillhaveaquestion"></a>

Please feel free to contact our [technical team](https://webspellchecker.com/contact-us/) if you are having any difficulties with the configuration.


# Spelling autocorrect

### Overview <a href="#spellingautocorrect-overview" id="spellingautocorrect-overview"></a>

Spelling autocorrect as you type functionality (beta) was released on August 13, 2020, as a part of the WebSpellChecker [v5.15.0](https://webspellchecker.com/release-notes/v5-15-0/) release. Autocorrect automatically makes or suggests corrections for common spelling mistakes while users are typing.

It is a new feature enabled for:

* WProofreader core (e.g. WProofreader add-on for RTEs, plugin for WordPress, plugin for CKEditor 5, browser extension);
* API.

The feature is available for all languages where spelling is supported (excluding Japanese and Chinese).

For the [25 most popular languages that are enabled by default](/v6.10.0.0/features/supported-languages) for the on-premises version, autocorrect is based on the replaced\_data statistics that were extracted from our databaseDB to the \*.cvs files with word pairs that will be used initially for autocorrect. The same files are for the Cloud and Standalone versions. Autocorrect for other languages generates suggestions purely from spell-check dictionaries.

While the on-premises client can configure what languages should have autocorrect enabled using **AppServerX.xml**.

{% hint style="info" %}
There is a [known issue](https://github.com/WebSpellChecker/wproofreader-ckeditor5/issues/46) with how the autocorrect functionality works in the Firefox and CKEditor 5 bundle. It's limited to some cases where a misspelled word is followed by a comma or other punctuation symbol (while it is supposed to work with 'space'). Due to certain specifics of CKEditor 5, we are not able to fix that right away but it is in our plans.
{% endhint %}

### The autocorrect mechanism <a href="#spellingautocorrect-theautocorrectmechanism" id="spellingautocorrect-theautocorrectmechanism"></a>

The trigger action that starts autocorrection — the user types a word and presses the space key or comma.

The algorithm behind autocorrect relies on a similarity score ([Levenshtein distance](https://en.wikipedia.org/wiki/Levenshtein_distance)). If the condition is not met, we return an empty response → no autoreplace.

Also, there is an additional check for the languages that use the replaced\_data statistics file. The algorithm will check if the word for replacing is present in one of the available dictionaries: language dictionary, user, or company custom dictionary. If a word is not present in the dictionary, we will not use the word from the autocorrect file.

In the case of an autodetected language, autocorrect uses the last detected language as a language for autocorrect check.

The user can undo the correction using the **revert** option. For now, the revert isn't localized and is valid only for the current section.

Some clients may want to have their own lists for autocorrection. This option will be available for on-premises clients only. Cloud customers may report the most common corrections, and we will add them manually.

### How autocorrect works <a href="#spellingautocorrect-howtheautocorrectworks" id="spellingautocorrect-howtheautocorrectworks"></a>

The user is typing text and Autocorrect automatically makes or suggests corrections for common spelling mistakes like *hte-the*, *havent-haven’t*, *isnt-isn’t*.

The autocorrected word will be underlined with a gray dotted line. End-users have an option to revert/undo the correction by hovering on it and selecting the original word.

Also, users can enable/disable Autocorrect in the Settings dialog of the product with the toggle “**Autocorrect**."

Check how it works in the video below or play with [demos here](https://demos.webspellchecker.com/).

<figure><img src="/files/Z56F3U0sYOPExKuDbBO1" alt=""><figcaption></figcaption></figure>

### How to configure Autocorrect <a href="#spellingautocorrect-howtoconfigureautocorrect" id="spellingautocorrect-howtoconfigureautocorrect"></a>

Admins can disable autocorrect by default by adding the **autocorrect** option set to **false** to WEBSPELLCHECKER\_CONFIG. In this case, end-users still will have an option to enable autocorrect from the UI of the Settings dialog.

```javascript
<script>
window.WEBSPELLCHECKER_CONFIG = {
	...
    autocorrect: false,
	...
}
</script>
```

This option, as well as all other options for WProofreader, are available in the [WProofreader API options](https://webspellchecker.com/docs/api/wscbundle/Options.html).

#### **5. Instructions for managing autocorrect word pairs for on-premises clients** <a href="#autocorrect-5.instructionsformanagingautocorrectwordpairsforservercustomers" id="autocorrect-5.instructionsformanagingautocorrectwordpairsforservercustomers"></a>

To manage the list of current word pairs for Autocorrect or add new pairs, please follow the steps below:

1\. [Stop](https://docs.wproofreader.com/v6.10.0.0/features/pages/IA2KNQLXDh85TwDivL4y#mainappservercommands-stopappserverwindowslinux2.stopappserver) the WebSpellChecker AppServer.

2\. Navigate to the **WebSpellChecker\_Installation\_Path\AppServer\LanguageDictionaries\language\_shortcode** directory.

{% hint style="info" %}
Starting with WebSpellChecker version 5.29.2.0, the path to the autocorrect folders with the appropriate files was changed to the following: **WebSpellChecker\_Installation\_Path\AppServer\Resources.**
{% endhint %}

3\. Locate and open the "**language\_shortcode\_autocorrect.csv**" file.

4\. Make the desired changes to the file.

{% hint style="info" %}
There are specific criteria governing the word pairs eligible for Autocorrect. The initial word added should not exist in the dictionaries, enabling our proofreader to identify it as a misspelling. Conversely, the replacement word must be present in one of the dictionaries: the default language dictionary, user or company custom dictionary. Our Autocorrect mechanism strictly suggests valid words as corrections. Also, make sure that the following is true:

* Check that misspelling and correction are words (not phrases and etc.);
* Check that misspellings are lowercase (to exclude names, etc.) (For German we allow first capital letter only);
* Check that misspellings do not have numbers or dots;
* Check that size of the misspelled word >= 3;
* Check that desired suggestions do not have spaces.
  {% endhint %}

5\. Save the modified file.

6\. [Restart](https://docs.wproofreader.com/v6.10.0.0/features/pages/IA2KNQLXDh85TwDivL4y#mainappservercommands-startappserverwindowslinux1.startappserver) the WebSpellChecker AppServer to apply the changes.

By following these instructions, you will be able to effectively manage and update the Autocorrect word pairs in the designated file. If you encounter any issues or require further assistance, please don't hesitate to contact our support team at **<support@webspellchecker.com>**.

{% hint style="info" %}
The automated WebSpellChecker upgrade system will utilize the autocorrect wordlists of the most recently installed version, disregarding any manual changes made on your end. Consequently, to preserve your customized Autocorrect word pairs, it will be necessary to transfer them manually after the software upgrade. Therefore, we recommend carefully noting down your customizations before the upgrade and taking the necessary steps to reintegrate them afterward.
{% endhint %}


# Supported languages

You may try to evaluate spell & grammar checking functionality for a chosen language on the [supported languages demo page](https://webspellchecker.com/additional-dictionaries/).

Here is a list of all available and supported languages with their short codes. At the moment as a part of the cloud service we provide support for 82 languages and autodetect.

* The language codes have the following format: \[language\_code]\_\[country\_code].
* The next language and country codes standards have been used: [ISO 639‑1](https://en.wikipedia.org/wiki/ISO_639-1) and [ISO 3166-1](https://en.wikipedia.org/wiki/ISO_3166-1).
* The default language for localization of user interface is **American English**. If not defined explicitly, the interface language will be set based on the browser localization.
* Default language is `auto`. The system will try to define the language automatically based on the text if not explicitly specified.
* You can choose the desired list of languages while subscribing to the cloud version or installing the standalone one.

<table data-full-width="true"><thead><tr><th>Language</th><th>Spelling</th><th>Grammar</th><th>Style</th><th>AIWA</th><th>Medical lexicon</th><th>Legal lexicon</th><th>Country</th><th>Short code</th><th>UI localization code</th></tr></thead><tbody><tr><td>Autodetect</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td>auto</td><td></td></tr><tr><td>Afrikaans</td><td>+</td><td></td><td></td><td></td><td></td><td></td><td>South Africa</td><td>af_ZA</td><td>af</td></tr><tr><td>Albanian</td><td>+</td><td></td><td></td><td></td><td></td><td></td><td>Albania</td><td>sq_AL</td><td></td></tr><tr><td>Amharic</td><td>+</td><td></td><td></td><td></td><td></td><td></td><td>Ethiopia</td><td>am_ET</td><td></td></tr><tr><td>Arabic (Saudi Arabia)</td><td>+</td><td>+</td><td></td><td></td><td></td><td></td><td>Saudi Arabia</td><td>ar_SA</td><td>ar</td></tr><tr><td>Basque</td><td>+</td><td></td><td></td><td></td><td></td><td></td><td>Spain</td><td>eu_ES</td><td>eu</td></tr><tr><td>Bengali</td><td>+</td><td></td><td></td><td></td><td></td><td></td><td>India</td><td>bn_IN</td><td>bn</td></tr><tr><td>Bulgarian</td><td>+</td><td></td><td></td><td></td><td></td><td></td><td>Bulgaria</td><td>bg_BG</td><td>bg</td></tr><tr><td>Catalan (Catalonia)</td><td>+</td><td>+</td><td></td><td></td><td></td><td></td><td>Spain</td><td>ca_ES</td><td>ca</td></tr><tr><td>Catalan (Valencia)</td><td>+</td><td></td><td></td><td></td><td></td><td></td><td>Spain</td><td>cat_ES</td><td></td></tr><tr><td>Croatian</td><td>+</td><td></td><td></td><td></td><td></td><td></td><td>Croatia</td><td>hr_HR</td><td>hr</td></tr><tr><td>Czech</td><td>+</td><td></td><td></td><td></td><td></td><td></td><td>Czech Republic</td><td>cs_CZ</td><td>cs</td></tr><tr><td>Danish</td><td>+</td><td>+</td><td></td><td>+</td><td></td><td></td><td>Denmark</td><td>da_DK</td><td>da</td></tr><tr><td>Dutch (Netherlands)</td><td>+</td><td>+</td><td>+</td><td>+</td><td></td><td></td><td>The Netherlands</td><td>nl_NL</td><td>nl</td></tr><tr><td>English (Australia)</td><td>+</td><td>+</td><td>+</td><td>+</td><td>+</td><td>+</td><td>Australia</td><td>en_AU</td><td>en-au</td></tr><tr><td>English (Canada)</td><td>+</td><td>+</td><td>+</td><td>+</td><td>+</td><td>+</td><td>Canada</td><td>en_CA</td><td>en-ca</td></tr><tr><td>English (New Zealand)</td><td>+</td><td>+</td><td>+</td><td>+</td><td>+</td><td>+</td><td>New Zealand</td><td>en_NZ</td><td></td></tr><tr><td>English (South Africa)</td><td>+</td><td>+</td><td>+</td><td>+</td><td>+</td><td>+</td><td>South Africa</td><td>en_ZA</td><td></td></tr><tr><td>English (UK)</td><td>+</td><td>+</td><td>+</td><td>+</td><td>+</td><td></td><td>The United Kingdom</td><td>en_GB</td><td>en-gb</td></tr><tr><td>English (US)</td><td>+</td><td>+</td><td>+</td><td>+</td><td>+</td><td>+</td><td>United States</td><td>en_US</td><td>en-us</td></tr><tr><td>Estonian</td><td>+</td><td></td><td></td><td></td><td></td><td></td><td>Estonia</td><td>et_EE</td><td>et</td></tr><tr><td>Finnish</td><td>+</td><td></td><td></td><td></td><td></td><td></td><td>Finland</td><td>fi_FI</td><td>fi</td></tr><tr><td>French (Canada)</td><td>+</td><td>+</td><td>+</td><td>+</td><td>+</td><td></td><td>Canada</td><td>fr_CA</td><td>fr-ca</td></tr><tr><td>French (France)</td><td>+</td><td>+</td><td></td><td>+</td><td>+</td><td></td><td>France</td><td>fr_FR</td><td>fr</td></tr><tr><td>Galician</td><td>+</td><td>+</td><td></td><td></td><td></td><td></td><td>Spain</td><td>gl_ES</td><td>gl</td></tr><tr><td>German (Austria)</td><td>+</td><td>+</td><td>+</td><td>+</td><td>+</td><td></td><td>Austria</td><td>de_AT</td><td></td></tr><tr><td>German (Germany)</td><td>+</td><td>+</td><td>+</td><td>+</td><td>+</td><td></td><td>Germany</td><td>de_DE</td><td>de</td></tr><tr><td>German (Switzerland)</td><td>+</td><td>+</td><td>+</td><td>+</td><td>+</td><td></td><td>Switzerland</td><td>de_CH</td><td>de-ch</td></tr><tr><td>Greek</td><td>+</td><td>+</td><td></td><td></td><td></td><td></td><td>Greece, Cyprus</td><td>el_GR</td><td>el</td></tr><tr><td>Hebrew</td><td>+</td><td></td><td></td><td></td><td></td><td></td><td>Israel</td><td>he_HE</td><td>he</td></tr><tr><td>Hindi</td><td>+</td><td></td><td></td><td></td><td></td><td></td><td>India</td><td>hi_IN</td><td></td></tr><tr><td>Hungarian</td><td>+</td><td></td><td></td><td></td><td></td><td></td><td>Hungary</td><td>hu_HU</td><td>hu</td></tr><tr><td>Icelandic</td><td>+</td><td></td><td></td><td></td><td></td><td></td><td>Iceland</td><td>is_IS</td><td>is</td></tr><tr><td>Indonesian</td><td>+</td><td></td><td></td><td></td><td></td><td></td><td>Indonesia</td><td>id_ID</td><td>id</td></tr><tr><td>Irish</td><td>+</td><td>+</td><td></td><td></td><td></td><td></td><td>Ireland</td><td>ga_IE</td><td></td></tr><tr><td>Italian (Italy)</td><td>+</td><td>+</td><td>+</td><td>+</td><td>+</td><td></td><td>Italy</td><td>it_IT</td><td>it</td></tr><tr><td>Japanese</td><td></td><td>+</td><td></td><td></td><td></td><td></td><td>Japan</td><td>ja_JP</td><td>ja</td></tr><tr><td>Korean</td><td>+</td><td></td><td></td><td></td><td></td><td></td><td>South Korea</td><td>ko_KR</td><td>ko</td></tr><tr><td>Latvian</td><td>+</td><td></td><td></td><td></td><td></td><td></td><td>Latvia</td><td>lv_LV</td><td>lv</td></tr><tr><td>Lingala</td><td>+</td><td></td><td></td><td></td><td></td><td></td><td>Dem. Rep. of Congo</td><td>ln_CD</td><td></td></tr><tr><td>Lithuanian</td><td>+</td><td></td><td></td><td></td><td></td><td></td><td>Lithuania</td><td>lt_LT</td><td>lt</td></tr><tr><td>Luxembourgish</td><td>+</td><td></td><td></td><td></td><td></td><td></td><td>Luxembourg</td><td>lb_LU</td><td>lb</td></tr><tr><td>Malay (Malaysia)</td><td>+</td><td></td><td></td><td></td><td></td><td></td><td>Malaysia</td><td>ms_MY</td><td>ms</td></tr><tr><td>Malayalam</td><td>+</td><td></td><td></td><td></td><td></td><td></td><td>India</td><td>ml_IN</td><td></td></tr><tr><td>Māori</td><td>+</td><td></td><td></td><td></td><td></td><td></td><td>New Zealand</td><td>mi_NZ</td><td></td></tr><tr><td>Mongolian</td><td>+</td><td></td><td></td><td></td><td></td><td></td><td>Mongolia</td><td>mn_MN</td><td>mn</td></tr><tr><td>Northern Sotho</td><td>+</td><td></td><td></td><td></td><td></td><td></td><td>South Africa</td><td>ns_ZA</td><td></td></tr><tr><td>Norwegian (Bokmål)</td><td>+</td><td></td><td></td><td>+</td><td></td><td></td><td>Norway</td><td>nb_NO</td><td>nb</td></tr><tr><td>Norwegian (Nynorsk)</td><td>+</td><td></td><td></td><td></td><td></td><td></td><td>Norway</td><td>nn_NO</td><td>no</td></tr><tr><td>Polish</td><td>+</td><td>+</td><td></td><td>+</td><td></td><td></td><td>Poland</td><td>pl_PL</td><td>pl</td></tr><tr><td>Portuguese (Brazil)</td><td>+</td><td>+</td><td>+</td><td>+</td><td></td><td></td><td>Brazil</td><td>pt_BR</td><td>pt-br</td></tr><tr><td>Portuguese (Portugal)</td><td>+</td><td>+</td><td>+</td><td>+</td><td></td><td></td><td>Portugal</td><td>pt_PT</td><td>pt</td></tr><tr><td>Romanian (Romania)</td><td>+</td><td>+</td><td></td><td></td><td></td><td></td><td>Romania</td><td>ro_RO</td><td>ro</td></tr><tr><td>Russian</td><td>+</td><td>+</td><td></td><td></td><td></td><td></td><td>Russia</td><td>ru_RU</td><td>ru</td></tr><tr><td>Russian (strict ё)</td><td>+</td><td>+</td><td></td><td></td><td></td><td></td><td>Russia</td><td>ry_RU</td><td>ru</td></tr><tr><td>Scottish Gaelic (UK)</td><td>+</td><td></td><td></td><td></td><td></td><td></td><td>Gaelic Scotland</td><td>gd_GB</td><td></td></tr><tr><td>Simplified Chinese</td><td></td><td>+</td><td></td><td></td><td></td><td></td><td>Mainland China, Singapore</td><td>zh_CN</td><td>zh-cn</td></tr><tr><td>Slovak</td><td>+</td><td>+</td><td></td><td></td><td></td><td></td><td>Slovakia</td><td>sk_SK</td><td>sk</td></tr><tr><td>Slovenian</td><td>+</td><td>+</td><td></td><td></td><td></td><td></td><td>Slovenia</td><td>sl_SI</td><td>sl</td></tr><tr><td>Southern Ndebele</td><td>+</td><td></td><td></td><td></td><td></td><td></td><td>South Africa</td><td>nr_ZA</td><td></td></tr><tr><td>Southern Sotho</td><td>+</td><td></td><td></td><td></td><td></td><td></td><td>South Africa</td><td>st_ZA</td><td></td></tr><tr><td>Spanish (Argentina)</td><td>+</td><td>+</td><td></td><td>+</td><td>+</td><td></td><td>Argentina</td><td>es_AR</td><td></td></tr><tr><td>Spanish (Chile)</td><td>+</td><td>+</td><td></td><td>+</td><td>+</td><td></td><td>Chile</td><td>es_CL</td><td></td></tr><tr><td>Spanish (Colombia)</td><td>+</td><td>+</td><td></td><td>+</td><td>+</td><td></td><td>Columbia</td><td>es_CO</td><td></td></tr><tr><td>Spanish (Costa Rica)</td><td>+</td><td>+</td><td></td><td>+</td><td>+</td><td></td><td>Costa Rica</td><td>es_CR</td><td></td></tr><tr><td>Spanish (Dominican Republic)</td><td>+</td><td>+</td><td></td><td>+</td><td></td><td></td><td>Dominican Republic</td><td>es_DO</td><td></td></tr><tr><td>Spanish (Mexico)</td><td>+</td><td>+</td><td></td><td>+</td><td>+</td><td></td><td>Mexico</td><td>es_MX</td><td></td></tr><tr><td>Spanish (Peru)</td><td>+</td><td>+</td><td></td><td>+</td><td>+</td><td></td><td>Peru</td><td>es_PE</td><td></td></tr><tr><td>Spanish (Puerto Rico)</td><td>+</td><td>+</td><td></td><td>+</td><td>+</td><td></td><td>Puerto Rico</td><td>es_PR</td><td></td></tr><tr><td>Spanish (Spain)</td><td>+</td><td>+</td><td></td><td>+</td><td>+</td><td></td><td>Spain</td><td>es_ES</td><td>es</td></tr><tr><td>Spanish (Uruguay)</td><td>+</td><td>+</td><td></td><td>+</td><td>+</td><td></td><td>Uruguay</td><td>es_UY</td><td></td></tr><tr><td>Spanish (Venezuela)</td><td>+</td><td>+</td><td></td><td>+</td><td></td><td></td><td>Venezuela</td><td>es_VE</td><td></td></tr><tr><td>Swahili (Kenya)</td><td>+</td><td></td><td></td><td></td><td></td><td></td><td>Kenya</td><td>sw_KE</td><td></td></tr><tr><td>Swedish</td><td>+</td><td>+</td><td></td><td>+</td><td></td><td></td><td>Sweden, Finland</td><td>sv_SE</td><td>sv</td></tr><tr><td>Tagalog</td><td>+</td><td>+</td><td></td><td></td><td></td><td></td><td>Philippines</td><td>tl_PH</td><td></td></tr><tr><td>Telugu</td><td>+</td><td></td><td></td><td></td><td></td><td></td><td>India</td><td>te_IN</td><td></td></tr><tr><td>Tok Pisin</td><td>+</td><td></td><td></td><td></td><td></td><td></td><td>Papua New Guinea</td><td>tpi_PG</td><td></td></tr><tr><td>Turkish</td><td>+</td><td></td><td></td><td></td><td></td><td></td><td>Turkey</td><td>tr_TR</td><td>tr</td></tr><tr><td>Ukrainian</td><td>+</td><td>+</td><td>+</td><td>+</td><td></td><td></td><td>Ukraine</td><td>uk_UA</td><td>uk</td></tr><tr><td>Urdu</td><td>+</td><td></td><td></td><td></td><td></td><td></td><td>Pakistan</td><td>ur_PK</td><td></td></tr><tr><td>Vietnamese</td><td>+</td><td></td><td></td><td></td><td></td><td></td><td>Vietnam</td><td>vi_VN</td><td>vi</td></tr><tr><td>Welsh</td><td>+</td><td></td><td></td><td></td><td></td><td></td><td>Wales</td><td>cy_GB</td><td>cy</td></tr><tr><td>Xhosa</td><td>+</td><td></td><td></td><td></td><td></td><td></td><td>South Africa</td><td>xh_ZA</td><td></td></tr><tr><td>Zulu</td><td>+</td><td></td><td></td><td></td><td></td><td></td><td>South Africa</td><td>zu_ZA</td><td></td></tr></tbody></table>


# Specialized dictionaries

The specialized dictionaries extend the default/common language dictionaries, and no additional configuration is needed. Enabled by default since v5.17.0.

| Specialized dictionary | Enabled                                                                                                                                                               | Comments                                                |
| ---------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------- |
| English medical        | <ul><li>English (US)</li><li>English (UK)</li><li>English (Canada)</li><li>English (Australia)</li><li>English (New Zealand)</li><li>English (South Africa)</li></ul> | <p>\~ 181,772 words (AmE)<br>\~ 156,565 words (BrE)</p> |
| French medical         | <ul><li>French (France)</li><li>French (Canada)</li></ul>                                                                                                             | 24,920 words                                            |
| German medical         | <ul><li>German (Germany)</li><li>German (Switzerland)</li><li>German (Austria)</li></ul>                                                                              | 16,089 words                                            |
| Spanish medical        | <ul><li>Spanish (Spain)</li><li>Spanish dialects (such as es\_ES, es\_MX, es\_AR, es\_CL, es\_CO, es\_CR, es\_PE, es\_PR, es\_UY)</li></ul>                           | 6,661 words                                             |
| English legal          | <ul><li>English (US)</li><li>English (UK)</li><li>English (Canada)</li><li>English (Australia)</li><li>English (New Zealand)</li><li>English (South Africa)</li></ul> | <p>\~ 4,719 (AmE)<br>\~ 4,865 (BrE)</p>                 |
| Italian medical        | <ul><li>Italian (Italy)</li></ul>                                                                                                                                     | 368                                                     |
| Swedish medical        | <ul><li>Swedish</li></ul>                                                                                                                                             | 115                                                     |

{% hint style="info" %}
For all third party resources used, please see the [Resource credits and acknowledgments](https://webspellchecker.com/resource-credits-and-acknowledgments/) page.
{% endhint %}


# Custom dictionary

**Custom dictionaries** allow you to extend the standard spell-check vocabulary with words specific to your organization, industry, or personal workflow, such as brand names, acronyms, technical terms, and proper names.

Words added to a custom dictionary are treated as correct during spell check. With the algorithmic spelling engine, dictionary words also appear in the suggestions list when a similar word is misspelled. With AI-based spelling, dictionary words won't be flagged as incorrect but won't appear as suggestions.

### Types of custom dictionaries

WProofreader provides two types of custom dictionaries designed for different use cases: **user dictionary** and **organization custom dictionary**.

|                             | User dictionary                                                                                                                                                                                   | Organization dictionary                                                                       |
| --------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- |
| **Purpose**                 | Personal wordlist owned by an end user                                                                                                                                                            | Shared wordlist managed by admins, intended to cover terminology used across the organization |
| **Scope**                   | Personal by default. Visible only to the user who created it. However, if an admin predefines the same dictionary name for multiple users via config, those users will share a single dictionary. | Applies to all users in the subscription or to targeted user groups                           |
| **Language dependency**     | Language-agnostic. Works across all enabled languages.                                                                                                                                            | Language-dependent. One dictionary per language.                                              |
| **Where managed**           | Product UI (WProofreader / SCAYT) or API                                                                                                                                                          | Cloud: admin panel (app.wproofreader.com) or API. Self-hosted: config files or API.           |
| **Can be enabled/disabled** | Yes. Via connect/disconnect in the product UI, or programmatically by setting/removing `userDictionaryName`.                                                                                      | Yes. Via status toggle in the admin panel, or programmatically via API.                       |
| **API command name**        | `user_dictionary`                                                                                                                                                                                 | `custom_dictionary`                                                                           |
| **Max dictionaries**        | Unlimited, but only one active at a time per user                                                                                                                                                 | 50 per account                                                                                |
| **Max dictionary size**     | 50 KB (approximately 10,000 words)                                                                                                                                                                | 500 KB per dictionary (approximately 100,000 English words; varies by language)               |
| **Word rules**              | Max 63 characters. No spaces. No dots at start or end. No punctuation or special characters.                                                                                                      | Same                                                                                          |
| **Dictionary naming**       | Latin characters and/or digits only. Must be unique.                                                                                                                                              | Same. Max 50 characters.                                                                      |

### Which one should you use?

**Use a user dictionary when the wordlist is:**

* Owned by an individual end user
* Managed and accessible by the user directly from the product UI (adding, deleting words, and so on)
* Modified at runtime as the user works
* Not tied to a specific language

**Use an organization dictionary when the wordlist is:**

* Shared across many users
* Managed by admins or automation
* Split by language
* Part of a structured workflow (create, enable/disable, audit, delete)


# User dictionary

A **user dictionary** is a personal dictionary that allows end users to store custom words such as acronyms, proper names, and complex terms. Words added to a user dictionary are treated as correct during spellcheck. With the algorithmic spelling engine, these words also appear in the suggestions list. With AI-based spelling, they won't be flagged as incorrect but won't appear as suggestions.

User dictionaries are **language-agnostic**. Words in different languages are all stored in one dictionary regardless of the spell-check language selected.

End users manage their dictionaries through the product UI (WProofreader or SCAYT). There's no admin panel interface for user dictionaries. For instructions on creating dictionaries, adding words, and managing the wordlist from the product UI, refer to the [WProofreader user manual →](/v6.10.0.0/user-manuals/user-manual).

API command name: `user_dictionary` ([API reference →](/v6.10.0.0/api-reference/overview))

### How it works

By default, when a user adds words without creating a named dictionary, those words are stored only in the **browser local storage**. This means the words are limited to that specific browser and device and will be lost if the storage is cleared.

Once a user creates a named dictionary, all words, including any previously stored in local storage, are moved to the server. This allows the user to access the dictionary from different browsers, machines, and devices.

The dictionary is available only to the user who created it and knows the dictionary name, or to users for whom the dictionary was programmatically predefined by an admin via the `userDictionaryName` configuration parameter.

### Predefined user dictionary

Admins can pre-assign a named dictionary for users by setting the `userDictionaryName` option in the WProofreader configuration. This ensures that words are always stored server-side from the start, with no reliance on browser local storage.

If you set the same `userDictionaryName` value for multiple users, they'll all share the same dictionary. Words added by any of those users will be visible to all of them. To keep dictionaries personal, assign a unique dictionary name per user, for example based on user ID or username.

#### Configuration by integration

| Integration                                    | Parameter                                             |
| ---------------------------------------------- | ----------------------------------------------------- |
| WProofreader SDK (including CKEditor 5 plugin) | `userDictionaryName: 'dictionary-name'`               |
| SCAYT plugin for CKEditor 4                    | `config.scayt_userDictionaryName = 'dictionary-name'` |

#### Example: WProofreader configuration with a predefined user dictionary

```html
<script>
window.WEBSPELLCHECKER_CONFIG = {
    ...
    userDictionaryName: 'user-123-dictionary'
};
</script>
```

#### Hiding dictionary preferences from end users

You can prevent end users from removing, renaming, or disconnecting the predefined dictionary by adding the `disableDictionariesPreferences` option. When enabled, the dictionary settings section in the product UI will be hidden.

```html
<script>
window.WEBSPELLCHECKER_CONFIG = {
    ...
    userDictionaryName: 'user-123-dictionary',
    disableDictionariesPreferences: true
};
</script>
```

#### Example: SCAYT plugin for CKEditor 4

```javascript
config.scayt_userDictionaryName = 'user-123-dictionary';
```

### Limitations

| Limit                     | Value                                                |
| ------------------------- | ---------------------------------------------------- |
| Max dictionary size       | 50 KB (approximately 10,000 words)                   |
| Max dictionaries per user | Unlimited, but only one can be active at a time      |
| Max characters per word   | 63                                                   |
| Dictionary naming         | Latin characters and/or digits only. Must be unique. |

Words can't contain spaces, dots at the beginning or end, punctuation, or special characters. Duplicate words are rejected automatically. Words can't be edited. To modify a word, delete it and add the corrected version.

### Self-hosted specifics

On self-hosted deployments, user dictionaries are saved as plain text files in UTF-8 encoding at the following location:

```
<WebSpellChecker_Installation_Path>/AppServer/UserDictionaries/
```

Admins can access and manage these files directly on the server if needed. Programmatic management is also available through the user dictionary API.

### API reference

The `user_dictionary` API allows programmatic management of user dictionaries, including creating and deleting dictionaries, adding and removing words, and retrieving wordlists.

[User dictionary API reference →](/v6.10.0.0/api-reference/user-custom-dictionary-api)

### FAQ

#### Are words in the user dictionary case-sensitive?

Yes. The system compares the exact string stored in the dictionary with the word entered in the text field. However, a lowercase word will also be accepted when written with an initial capital letter. For example, adding "*webspell*" means both "*webspell*" and "*Webspell*" are treated as correct, but "*WEBSPELL*" isn't. A word added with an initial capital will only match that exact casing.

#### Are user dictionary words language-specific?

No. User dictionaries are language-agnostic. Words are stored in a single dictionary regardless of which spell-check language is selected.

#### Can a user have more than one dictionary?

Yes, users can create multiple dictionaries. However, only one dictionary can be connected and active at a time. To switch dictionaries, the user must disconnect the current one and connect another.

#### Where are dictionary words stored?

By default, words are stored in the browser local storage. Once a user creates a named dictionary, all words (including those from local storage) are moved to the server. For Cloud deployments, dictionaries are stored on WebSpellChecker servers and associated with a Service ID (subscription). For self-hosted deployments, dictionaries are stored at `<InstallPath>/AppServer/UserDictionaries/` as plain text files.

#### Is it possible to protect a user dictionary with a password?

No. This functionality isn't available. The recommended approach is to use a complex, unique name for the dictionary.

#### What happens if I clear my browser storage and don't have a named dictionary?

All words are lost. Creating a named dictionary or having an admin predefine one via `userDictionaryName` ensures words are saved server-side and aren't affected by browser storage changes.

For end-user instructions on creating, connecting, renaming, and deleting dictionaries via the product UI, refer to the [WProofreader user manual →](/v6.10.0.0/user-manuals/user-manual).


# User dictionary user manual

A user dictionary is your personal wordlist of custom words that WProofreader or SCAYT should treat as correct, such as names, acronyms, technical terms, or industry-specific words. Once a word is added to your dictionary, it won't be flagged as a misspelling. With the algorithmic spelling engine, dictionary words will also appear in the suggestions list when you misspell a similar word.

User dictionaries are language-agnostic. All words go into one dictionary regardless of which spell-check language you're using.

### How storage works

When you add words without creating a named dictionary, they're stored in your browser's local storage. This means:

* Words are only available in the browser where you added them.
* Words will be lost if you clear your browser storage.

To access your words from any browser, device, or machine, create a named dictionary. Once you do, all your words (including any already in local storage) are moved to the server and stored permanently.

### WProofreader

#### Creating a dictionary

1. Hover over the WProofreader badge in the bottom right corner of the text field.
2. Click the **Settings** icon.
3. Navigate to the **Dictionary** tab.
4. In the "*Enter a dictionary name*" field, type a name for your dictionary and click **Create**.
5. A confirmation message appears. Your dictionary is now active and words will be stored on the server.

<div align="left"><figure><img src="/files/DVWXHZ43al8BtZoevwFa" alt="" width="375"><figcaption></figcaption></figure></div>

#### Connecting to an existing dictionary

If you've previously created a dictionary and need to reconnect to it (for example, from a different browser):

1. Open the **Dictionary** tab in WProofreader settings.
2. Type the name of your existing dictionary and click **Connect**.

Your previously saved words will be available again.

<div align="left"><figure><img src="/files/c8ePi55p7saQckcScgx9" alt="Dictionary tab with Connect option" width="375"><figcaption></figcaption></figure></div>

#### Adding words

There are three ways to add words to your dictionary:

**From the suggestions popup.** Hover over a flagged word in the text and click **Add word** in the suggestions card.

<div align="left"><figure><img src="/files/T7jCxDVwmrZ67tHkEmMb" alt="Suggestions popup with Add word option" width="211"><figcaption></figcaption></figure></div>

**From the dictionary tab.** Open WProofreader settings, go to the **Dictionary** tab, type a word in the "Enter a new word" field, and click **Add** or press Enter.

<div align="left"><figure><img src="/files/MJD0uwCO3QXRYduvhiTr" alt="" width="375"><figcaption></figcaption></figure></div>

**From proofread in dialog mode.** Open the proofread in dialog mode and click **Add word** next to a flagged spelling issue.

#### Viewing your words

Open the **Dictionary** tab in WProofreader settings. All words in your currently connected dictionary are listed below the "Enter a new word" field.

#### Deleting a word

In the **Dictionary** tab, find the word you want to remove and click the **×** icon next to it. The word will be removed from your dictionary and may be flagged as a misspelling again.

Words can't be edited directly. To change a word, delete it first, then add the corrected version.

#### Renaming a dictionary

1. Open the **Dictionary** tab in WProofreader settings.
2. Click the menu icon (three dots) next to the dictionary name.
3. Select **Rename**.
4. Enter the new name and confirm.

#### Disconnecting a dictionary

Disconnecting a dictionary removes the connection between your current session and the dictionary. The dictionary and its words aren't deleted. You can reconnect to it later by entering its name.

1. Open the **Dictionary** tab in WProofreader settings.
2. Click the menu icon (three dots) next to the dictionary name.
3. Select **Disconnect**.

#### Deleting a dictionary

Deleting a dictionary permanently removes it and all its words. This action can't be undone.

1. Open the **Dictionary** tab in WProofreader settings.
2. Click the menu icon (three dots) next to the dictionary name.
3. Select **Delete**.

### SCAYT plugin for CKEditor 4

#### Creating a dictionary

1. On the CKEditor toolbar, click the **ABC** icon.
2. In the dropdown menu, select **Dictionaries**.
3. The SCAYT dialog opens on the **Dictionaries** tab.
4. Click the **Dictionary Preferences** button.
5. Type a name for your new dictionary and click **Create**.
6. A confirmation message appears. Click **OK** to save.

#### Connecting to an existing dictionary

If you've previously created a dictionary and need to reconnect to it:

1. Open the **Dictionaries** tab in SCAYT.
2. Click **Dictionary Preferences**.
3. If another dictionary is currently connected, click **Disconnect** first.
4. Type the name of your existing dictionary and click **Connect**.
5. Click **OK** to save.

#### Adding words

**From the suggestions popup.** Right-click on a flagged word and select **Add word** from the SCAYT context menu.

**From the dictionaries tab.** Open the SCAYT **Dictionaries** tab, type a word in the "Add word" field, and click **Add word**, then click **OK**.

#### Viewing your words

Open the **Dictionaries** tab in SCAYT. Words in your currently connected dictionary are listed in the lower part of the screen.

#### Deleting a word

In the **Dictionaries** tab, find the word you want to remove and click the **×** icon next to it.

Words can't be edited directly. To change a word, delete it first, then add the corrected version.

#### Disconnecting a dictionary

1. Open the **Dictionaries** tab in SCAYT.
2. Click **Dictionary Preferences**.
3. Click **Disconnect**.

The dictionary and its words aren't deleted. You can reconnect later by entering the dictionary name.

#### Deleting a dictionary

Deleting a dictionary permanently removes it and all its words. This action can't be undone.

1. Connect to the dictionary you want to delete (if it isn't already connected).
2. Click the **Delete** button.

### Tips

* **Choose a unique dictionary name.** Your dictionary name is how you access it. Use something memorable but hard for others to guess, since there's no password protection.
* **Create a named dictionary early.** Don't rely on browser local storage. Creating a named dictionary ensures your words are saved on the server and accessible from any browser or device.
* **Only one dictionary at a time.** You can create multiple dictionaries, but only one can be active at a time. To switch, disconnect the current dictionary and connect another.
* **Duplicates are prevented.** If you try to add a word that's already in your dictionary, it won't be added again.
* **Dictionary naming rules.** Dictionary names must use Latin characters and/or digits only. They must be unique.


# Organization dictionary

An organization dictionary is a shared wordlist that extends the standard spell-check vocabulary with terms specific to your industry, domain, or organization. Words in an enabled organization dictionary are treated as correct during spellcheck for all users of your web application, or for targeted user groups. With the algorithmic spelling engine, dictionary words also appear in the suggestions list. With AI-based spelling, dictionary words won't be flagged but won't appear as suggestions.

Organization dictionaries are language-dependent. Each dictionary is tied to a specific language and extends the wordlist of that language only.

API command name: `custom_dictionary` ([API reference →](/v6.10.0.0/api-reference/overview))

### Availability

* **Cloud.** Available for all customers with a trial or paid subscription to WebSpellChecker Cloud Services. Dictionaries aren't available until the subscription is obtained. Admins manage dictionaries through the admin panel at [app.wproofreader.com](https://app.wproofreader.com) or through the API.
* **Self-hosted.** Available with the on-premises product version. Admins manage dictionaries through configuration files on the server or through the API.

### Key concepts

* **Dictionary ID.** A numeric identifier for the dictionary. On cloud, it's assigned automatically when the dictionary is created. On self-hosted, you assign it manually in `CustDictConfig.xml`. The ID is required for configuring your web application and for all API operations.
* **Dictionary name.** A human-readable label for the dictionary. Max 50 characters. Must be unique within the account. Latin characters and/or digits only. On self-hosted, the dictionary is identified by its `DicId` and `FileName` rather than a name in the UI.
* **Language.** Each dictionary is tied to a specific language (for example, American English or British English) and extends the wordlist of that language only. You can't create a dictionary for the "autodetect" language or for grammar-only languages such as Simplified Chinese and Japanese.
* **Status (Cloud only).** Enabled or disabled. Enabled dictionaries are used in spell check. Disabled dictionaries are excluded from spell check silently but remain accessible in the admin panel and via the API. They can be re-enabled at any time.
* **Sync delay (Cloud only).** Changes to dictionaries, such as creation, status updates, or word changes, require a short time to synchronize. A notification will appear in the admin panel confirming synchronization is in progress.

### Applying a dictionary to your web application

Use the `customDictionaryIds` configuration parameter to specify which dictionary or dictionaries to load. Pass the Dictionary ID that was assigned when the dictionary was created (Cloud) or that you defined in `CustDictConfig.xml` (self-hosted).

If `customDictionaryIds` isn't specified, all active (enabled) organization dictionaries for the subscription are applied by default.

#### Configuration by integration

| Integration                                    | Parameter                                    |
| ---------------------------------------------- | -------------------------------------------- |
| WProofreader SDK (including CKEditor 5 plugin) | `customDictionaryIds: 'DicId'`               |
| SCAYT plugin for CKEditor 4                    | `config.scayt_customDictionaryIds = 'DicId'` |

#### Example: WProofreader initialization with an organization dictionary

```html
<script>
window.WEBSPELLCHECKER_CONFIG = {
    ...
    lang: 'en_US',
    customDictionaryIds: '101572'
};
</script>
```

To load multiple dictionaries, pass their IDs as a comma-separated string:

```javascript
customDictionaryIds: '101572,101573'
```

#### Targeting specific user groups

By default, organization dictionaries apply to the entire subscription (Cloud) or to all users (self-hosted). If you can programmatically distinguish users, for example by role, department, or region, you can pass different `customDictionaryIds` values for different user groups in the WProofreader configuration.

### Verifying the dictionary works

1. Clear your browser cache before testing.
2. Go to your web page and enter words that have been added to the dictionary. They shouldn't be flagged as misspellings.
3. Misspell one of the dictionary words. With the algorithmic spelling engine, the correct form should appear in the suggestions list.

### Word rules

Words added to an organization dictionary must follow these rules:

* Max 63 characters per word
* No spaces
* No dots at the start or end
* No punctuation or special characters

Words are validated at request time. Invalid words reject the request before any action runs. Words that already exist in the standard dictionary are skipped and not added.

### Limitations

| Limit                        | Value                                                                                                          |
| ---------------------------- | -------------------------------------------------------------------------------------------------------------- |
| Max dictionaries per account | 50                                                                                                             |
| Max dictionary size          | 500 KB per dictionary (approximately 100,000 English words; varies by word length and language)                |
| Max characters per word      | 63                                                                                                             |
| Dictionary name (Cloud)      | Max 50 characters. Latin characters and/or digits only. Must be unique.                                        |
| Language                     | Can't create a dictionary for "autodetect" or grammar-only languages (such as Simplified Chinese and Japanese) |

If a wordlist exceeds the size limit, split it into multiple dictionaries.

### API reference

The `custom_dictionary` API provides full programmatic management of organization dictionaries, including creating and deleting dictionaries, adding and removing words, listing dictionaries, enabling or disabling dictionaries, and editing metadata.

Authorization requires an access key. For Cloud, the key can be found on the **Credentials** page in the admin panel.

[Organization dictionary API reference →](/v6.10.0.0/api-reference/custom-dictionary-api)

### Managing dictionaries

For step-by-step instructions on creating, editing, and deleting organization dictionaries, refer to the guide for your deployment:

* [Managing organization dictionaries in cloud (admin panel) →](/v6.10.0.0/features/custom-dictionary/organization-dictionary-cloud-admin-pan)
* [Managing organization dictionaries on self-hosted (config files) →](/v6.10.0.0/features/custom-dictionary/organization-dictionary-self-hosted-management)

### FAQ

#### Can I apply different dictionaries to different user groups?

Yes. If you can programmatically distinguish users in your application, you can pass different `customDictionaryIds` values in the WProofreader configuration for different groups.

#### Can I create a dictionary for the autodetect language?

No. Organization dictionaries are language-dependent and must be created for a specific language. You also can't create dictionaries for grammar-only languages such as Simplified Chinese and Japanese.

#### Why aren't some words I added appearing in the dictionary?

Words that already exist in the standard spell-check dictionary are automatically skipped. Only unique words that aren't part of the standard vocabulary are added.


# Organization dictionary: Self-hosted management

This guide covers how to manage organization dictionaries through configuration files on your server. For an overview of organization dictionaries, key concepts, integration configuration, and limitations, refer to the [Organization dictionary overview →](/v6.10.0.0/features/custom-dictionary/organization-dictionary).

### Creating a dictionary

#### Step 1: Prepare the wordlist file

Create a new file in `.txt` format with UTF-8 encoding. Add one word per line. It's recommended to sort the wordlist in alphabetical order.

You must add an empty line at the end of the file. Without it, the last word in the list won't be recognized.

For word rules and validation details, refer to the [Organization dictionary overview →](/v6.10.0.0/features/custom-dictionary/organization-dictionary).

#### Step 2: Place the file on the server

Place the wordlist file in the following directory:

```
<WebSpellChecker_Installation_Path>/AppServer/CustomDictionaries/
```

#### Step 3: Register the dictionary in the configuration

Open the configuration file:

```
<WebSpellChecker_Installation_Path>/AppServer/CustDictConfig.xml
```

Inside the `<CustomerDb>` tag, add a new `<Dictionary>` entry with the following values:

* `DicId` — a unique numeric ID (for example, `"3"`). Make sure this ID isn't already used by another dictionary in the file.
* `FileName` — the name of your `.txt` wordlist file.
* `LangShortName` — the language shortcode (for example, `en_US`).

Example:

```xml
<CustomerDb>
    <Dictionary DicId="3">
        <FileName>medical_terms.txt</FileName>
        <LangShortName>en_US</LangShortName>
    </Dictionary>
</CustomerDb>
```

You can add multiple `<Dictionary>` entries inside the same `<CustomerDb>` tag:

```xml
<CustomerDb>
    <Dictionary DicId="3">
        <FileName>medical_terms.txt</FileName>
        <LangShortName>en_US</LangShortName>
    </Dictionary>
    <Dictionary DicId="4">
        <FileName>legal_terms_de.txt</FileName>
        <LangShortName>de_DE</LangShortName>
    </Dictionary>
</CustomerDb>
```

### Editing and deleting dictionaries

**Editing a wordlist.** Open the `.txt` file and modify the words directly. Save the file in UTF-8 encoding. Remember to keep an empty line at the end of the file.

**Editing dictionary configuration.** Update the `DicId`, `FileName`, or `LangShortName` values in `CustDictConfig.xml` as needed.

**Deleting a dictionary.** Remove the corresponding `<Dictionary>` entry from `CustDictConfig.xml`. You can also delete the `.txt` file from the `CustomDictionaries` directory.

Restart AppServer after any configuration changes for them to take effect.

### Shared dictionaries across multiple servers

If you run multiple copies of the WProofreader application in a dynamic infrastructure where servers are added or removed based on workload, you should store dictionaries on a shared volume so all instances use the same wordlists.

#### How it works

Instead of keeping dictionary files on each server's local disk, you point all instances of the WProofreader application to a single shared storage location. This way, any changes to dictionaries are immediately available to all instances without manual synchronization.

#### Setting up shared storage

1. **Create a shared volume** accessible by all instances of the WProofreader application. The type of shared storage depends on your deployment:
   * **Linux:** a network file system (NFS) mount or similar shared volume
   * **Windows:** a shared network folder (SMB/CIFS)
   * **Docker:** a mounted volume with persistent storage (for example, Amazon EFS)
2. **Move your dictionary files** to the shared volume. This includes your wordlist `.txt` files and the `CustDictConfig.xml` configuration file.
3. **Update the configuration** on each instance. Open `<WebSpellChecker_Installation_Path>/AppServer/AppServerX.xml` and update the following paths to point to your shared volume:

```xml
<CustDictConfig>/path_to_shared-volume/CustDictConfig.xml</CustDictConfig>
<CustDictDir>/path_to_shared-volume/CustomDictionaries</CustDictDir>
```

4. **Restart AppServer** on each instance for the changes to take effect.

All instances will now read from and write to the same shared location. Any dictionaries you create or modify will be available across your entire infrastructure.

### FAQ

#### Do I need to restart AppServer after making changes?

Yes. Changes to `CustDictConfig.xml` or the wordlist files require an AppServer restart to take effect.

#### Why isn't the last word in my dictionary being recognized?

The wordlist file must end with an empty line (a newline character after the last word). Without it, the last word won't be processed.

#### Can I use the same dictionary file for multiple languages?

No. Each dictionary entry in `CustDictConfig.xml` is tied to a specific language via `LangShortName`. If you need the same words for multiple languages, create separate dictionary entries with different language shortcodes.

#### How do I keep dictionaries in sync across multiple servers?

Use a shared volume (NFS, SMB/CIFS, or a mounted persistent volume for Docker) and point all instances of the WProofreader application to it by updating the `<CustDictConfig>` and `<CustDictDir>` paths in `AppServerX.xml`. See the "Shared dictionaries across multiple servers" section above.

#### What file encoding should I use for the wordlist?

UTF-8. The wordlist must be a plain `.txt` file with one word per line.


# Organization dictionary: Cloud admin pan

This guide covers how to manage organization dictionaries through the admin panel at [app.wproofreader.com](https://app.wproofreader.com). For an overview of organization dictionaries, key concepts, integration configuration, and limitations, refer to the [Organization dictionary →](/v6.10.0.0/features/custom-dictionary/organization-dictionary).

### Accessing the admin panel

1. Sign in at [app.wproofreader.com](https://app.wproofreader.com).
2. In the left navigation panel, select [**Custom dictionary**](https://app.wproofreader.com/custom-dictionary).
3. If you already have dictionaries, you'll see them listed with the following columns: Dictionary name, Language, Dictionary ID, Words count, and Status. Otherwise, the list will be empty.

<figure><img src="/files/r8kuRXnF6GK8MJhWXvCr" alt=""><figcaption></figcaption></figure>

### Creating a dictionary

1. Click the **Create dictionary** button.
2. In the dialog that appears, fill in the following fields:
   * **Dictionary name.** Max 50 characters. Must be unique within your account.
   * **Language.** Select from the dropdown.
3. Click **Create**.

<div align="left"><figure><img src="/files/QFhmnZ4v4UZVID4Nuobi" alt="" width="375"><figcaption></figcaption></figure></div>

4. The dictionary appears in the list with a Dictionary ID assigned automatically. Use the copy icon next to the ID to save it for your web application configuration.
5. A sync notification will appear in the top right corner confirming the dictionary is being synchronized.

### Managing the wordlist

Click on a dictionary row to open the wordlist view.

<figure><img src="/files/2cPc9K216LCDvqvLJo4H" alt=""><figcaption></figcaption></figure>

* **Adding words.** Type a word in the "Add word..." field and click **Add**. Words can't contain spaces, punctuation, or special characters. A confirmation notification appears.

<figure><img src="/files/h5PadlFLfclpDvyMvOFP" alt=""><figcaption></figcaption></figure>

* **Importing words in bulk.** Click **Import wordlist** to upload a TXT file. The file must contain one word per line (not comma-separated) and must not exceed 500 KB. Importing replaces all existing words in the dictionary. Back up your current wordlist using the **Download** option before importing.

<div align="left"><figure><img src="/files/0jIyjBDy4GG9oXs5GKtq" alt="" width="563"><figcaption></figcaption></figure></div>

* **Downloading the wordlist.** Click **Download** to export the full wordlist as a file.
* **Searching words.** Use the "Search word..." field to find specific words in the dictionary.
* **Deleting words.** Click the **×** icon next to a word to remove it.

The wordlist view includes pagination at the bottom with a configurable number of words per page.

For word rules and validation details, refer to the [Organization dictionary →](/v6.10.0.0/features/custom-dictionary/organization-dictionary).

### Editing a dictionary name

In the dictionary list, click the pencil icon next to the dictionary name. Enter the new name (max 50 characters, must be unique) and save.

<figure><img src="/files/qrJeKLjSyZ2O2Bti0JbG" alt=""><figcaption></figcaption></figure>

### Enabling or disabling a dictionary

Toggle the **Status** switch in the dictionary list row. Disabled dictionaries are excluded from spellcheck but aren't deleted. They can be re-enabled at any time. A sync notification will appear confirming changes are being synchronized.

### Deleting a dictionary

Click the trash icon in the dictionary list row. If your web application configuration references this dictionary by ID using `customDictionaryIds`, update the configuration accordingly.

### FAQ

#### Why don't my dictionary changes take effect immediately?

Changes to dictionaries require a short time to synchronize. A notification in the admin panel will confirm when synchronization is complete.

#### What happens when I import a wordlist?

Importing a TXT file replaces all existing words in the dictionary. Always download your current wordlist as a backup before importing.

#### What file format does the import accept?

The import accepts TXT files only. Each word must be on a separate line (not comma-separated). The file must not exceed 500 KB.


# AI writing assistant (AIWA)

### Overview

WProofreader AI writing assistant (AIWA) is a text rewriter and content generation tool for multiple languages and their dialects. It changes your texts in different ways: shorten, expand, rewrite, improve and switch style, summarize key ideas and proofread.

AIWA is supported in all WProofreader versions by default, incl. the standalone version under the Enterprise plan. Within the latter, clients can access AI writing assistant via connecting their AWS Bedrock. Users of free browser extension users have access to the limited version of AIWA.

The usage is limited by daily word or prompt quotas that depend on your subscription plan. When you reach your daily limit, the AIWA feature is temporarily unavailable, but it doesn’t block the entire WProofreader integration. Quotas reset daily at 00:00 UTC.

AIWA is disabled by default and must be manually activated in the configuration script in SDK. The WProofreader browser extension users can enable or disable the extension via the UI settings.

### Text operations

Text operations provided by AI writing assistant (AIWA):

* **Shorten**: Sentence compression is the process of reducing the length of a sentence while preserving its core meaning, clarity, and grammatical correctness.
* **Expand**: Sentence expansion refers to the process of taking a basic or simple sentence and making it more detailed or complex, often by adding additional information or clarification. The goal of sentence expansion is typically to provide more context, enrich the content, or enhance the clarity and descriptiveness of the sentence.
* **Rewrite**: The goal of enhancing the text while preserving its original meaning, which can often be achieved without altering every sentence. This approach aligns with the prompt's instruction to optimize for a balance between conciseness and detail, as unnecessary changes could detract from the text's clarity and coherence.
* **Improve**: The process of sentence improvement involves refining a sentence to make it more effective in conveying its intended message. This process can encompass several objectives, from enhancing clarity and coherence to optimizing for a particular style or audience.
* **Make formal**: The process of changing the formality (tone and style) used in a sentence from informal/neutral to formal.
* **Make informal**: The process of changing the formality (tone and style) used in a sentence from formal/neutral to informal.
* **Summarize**: The process of making a high-level narrative or abstract that summarizes the key points of the original text.
* **Proofread**: The process of reviewing and correcting written material to improve accuracy, consistency, and quality.

The default prompts are manually crafted and tested for optimal results. Cloud users can't change them, while users of the self-hosted version can technically adjust the existing prompts, but we can't guarantee consistent performance if they do so.

### Security

AIWA functionality is based on foundational models, including Anthropic and other vendors hosted on Amazon Bedrock. Read here about the Anthropic [Responsible Disclosure Policy.](https://www.anthropic.com/responsible-disclosure-policy)

We don't collect user data in order to create a custom model. We collect only cases related to the Acceptable use policy violation, e.g. when the model’s outcome contains harmful or biased content, with the aim of eliminating the probability of such cases in the future. These cases are not used for model training either.

### User manual

The AI writing assistant if enabled can be launched by selecting the text (at least 100 characters), an orange badge will popup allowing the user to go into the selection of text operations.


# Accessibility

### Overview

We're committed to ensuring digital accessibility of WProofreader for people with disabilities. We are continually improving the user experience for everyone, and applying the relevant accessibility standards.

The current version of the WProofreader core (shipped as part of WebSpellChecker Server v5.28.3 package) is compatible with the [Section 508 Guidelines](https://www.access-board.gov/ict/) and the [World Wide Web Consortium’s Accessibility Guidelines (WCAG) 2.0 Level A/AA](http://www.w3.org/TR/2008/REC-WCAG20-20081211).

Regular self-run accessibility testing and VPAT report updates are available [on-demand](https://webspellchecker.com/contact-us/) to make sure WProofreader is still convenient for all users. The majority of success criteria on Level A and AA of WCAG 2.1 are covered, incl. keyboard navigation.

Our accessibility testing targets the **desktop web experience**, including:

* keyboard interaction
* desktop screen-reader compatibility
* automated accessibility validation
* semantic and structural checks
* visual and focus-state accessibility
* behavior inside standard HTML inputs and supported editors

Mobile devices, touch-based interaction, and mobile assistive technologies are **not part of the product design** and are therefore **out of scope**.

The WProofreader core was tested on macOS Ventura/Chrome using the below tools and methods:

* [Google Screen Reader](https://chrome.google.com/webstore/detail/screen-reader/kgejglhpjiefppelpmljglcjbhoiplfn)
* [Mac VoiceOver](https://support.apple.com/uk-ua/guide/voiceover/vo2682/mac)
* [WAVE Evaluation Tool](https://chrome.google.com/webstore/detail/wave-evaluation-tool/jbbplnpkjmmeebjpijfedlgcdilocofh)
* [axe DevTools](https://chrome.google.com/webstore/detail/axe-devtools-web-accessib/lhdoppojpmngadmnindnejefpokejbdd)
* [Stark](https://www.getstark.co/figma)
* [Figma built-in A11y](https://www.figma.com/community/plugin/733159460536249875/A11y---Color-Contrast-Checker)
* NVDA (Windows)
* Windows accessibility features
* [Lighthouse Accessibility](https://chromewebstore.google.com/detail/lighthouse/blipmdconlkpinefehnmjammfjpmpbjk)
* WebSpellChecker documentation
* Code inspection
* Keyboard-only interaction

### Accessibility testing coverage

#### Structural & semantic

* correct semantic roles and ARIA usage
* heading hierarchy
* name/role/state exposure
* valid and logical DOM structure

#### Keyboard navigation

* complete traversal using keyboard only
* visible focus states
* no keyboard traps

#### Forms & controls

* labels associated with inputs
* accessible error states and descriptions
* accessible buttons, toggles, dropdowns

#### Screen readers (web and desktop)

* correct announcements in screen readers
* proper reading order
* correct labeling of toolbar elements
* accessible interaction with editor-embedded components

#### Automated checks

* contrast validation
* ARIA correctness
* missing labels or alt attributes
* structural errors
* non-navigable interactive elements

**Current known issues:**

* Enhanced contrast does not meet WCAG AAA 1.4.6
* Visual presentation AAA not satisfied (user cannot control spacing/line length)
* Help and reading-level AAA not met
* Semantic purpose identification (1.3.6) not implemented

When accessibility issues are identified—internally or through client reports—we treat them as defects and address them as part of ongoing product maintenance.

For more information, send us a request to <accessibility@webspellchecker.net>.


# Analytics

### Overview

With the release of the new admin panel, we’ve introduced the Analytics page that provides more detailed information about word usage and features interaction insights.

Frequency and period, and languages are global filters. Each chart on the page can be saved as an SVG/PNG image in CSV format.

#### Word usage

Word usage chart shows the aggregated word usage during the selected period. By default, the usage statistics are presented for the last 7 days with the total number of words checked per day. You can check the usage details for the previous period as well (e.g. for the previous month, year).

<figure><img src="/files/crI1ykf2FeJJTgnALzhv" alt=""><figcaption></figcaption></figure>

The number that represents the number of words checked per day is the number of words checked per day with the check type that has more words analyzed during the day. Under check types we mean spelling, grammar, style, spelling autocorrect, autocomplete suggestions. When we calculate the usage, we don’t sum up words between all check types, but we use the check type with the highest usage during the day.

Let’s say, on a given day, only spelling and grammar checks were used, with 200 and 100 words accordingly. We will select the check type which processed more words. In our example, it is spelling with 200 words. In most cases, spelling will be the check type which we rely on the number of words checked. You may ask how it is possible to make such a difference and there is a list of cases. For example: for some languages, we offer only a spelling check and for some we use a grammar check only. This specifically relates to languages like Chinese and Japanese.

Please note that at the moment Language filter is added as global but it doesn’t work properly for the Word usage chart. In the case of using a language filter, the word usage will show more words checked due to the fact that it sums up words by several check types instead of showing usage for the check type with the highest usage.


# Overview

Endpoints, request format, and parameters common to all HTTP API commands.

The HTTP API uses a single endpoint.

It is **not RESTful**.

You control the API using the `cmd` parameter.

### On this page

* [API endpoint](#api-endpoint)
* [Request method](#request-method)
* [`cmd` (command)](#cmd-command)
* [Common parameters](#common-parameters)
  * [`serviceid`](#serviceid)
  * [`format`](#format)
  * [`callback`](#callback)
  * [`short_answer`](#short_answer-boolean)
* [Boolean parameter values](#boolean-parameter-values)
* [Errors](#errors)

### API endpoint

{% tabs %}
{% tab title="Cloud" %}
`https://svc.webspellchecker.net/api`

Pass parameters in the query string (GET) or request body (POST).

`serviceid` is required.
{% endtab %}

{% tab title="On-premises" %}
`http(s)://<host>:<port>/<virtual_dir>/api`

Pass parameters in the query string (GET) or request body (POST).

`serviceid` is not used.
{% endtab %}
{% endtabs %}

### Request method

Use **GET** or **POST**.

There is no functional difference.

* GET: parameters go in the URL query string.
* POST: parameters go in the request body.
  * Raw `key=value&...` parameters.
  * Or a JSON payload.

### `cmd` (command)

`cmd` selects the operation to run.

Examples: `check`, `autocorrect`, `autocomplete`.

See command docs for the full parameter list per command.

* [Check API](/v6.10.0.0/api-reference/check-api)
* [Spelling autocorrect API](/v6.10.0.0/api-reference/spelling-autocorrect-api)
* [Text autocomplete API](/v6.10.0.0/api-reference/text-autocomplete-api)
* [Custom dictionary API](/v6.10.0.0/api-reference/custom-dictionary-api)
* [User custom dictionary API](/v6.10.0.0/api-reference/user-custom-dictionary-api)
* [Detect language API](/v6.10.0.0/api-reference/detect-language-api)
* [Auxiliary API commands](/v6.10.0.0/api-reference/auxiliary-api-commands)

### Common parameters

These parameters can be used with any `cmd`.

At a glance:

* `serviceid`: Cloud API key
* `format`: response format (`json` or `xml`)
* `callback`: JSONP wrapper (JSON only)
* `short_answer`: shorten JSON keys (`true` or `false`)

#### `serviceid`

{% hint style="info" %}
Cloud only. Required for Cloud requests.
{% endhint %}

API key required to make requests.

#### `format`

{% hint style="info" %}
Default: `json`.
{% endhint %}

Response format.

Supported values:

* `json` (default)
* `xml`

#### `callback`

{% hint style="info" %}
Use it only with `format=json`.
{% endhint %}

Wraps the response as JSONP:

`/**/<callback_value>(<actual_response>)`

#### `serviceid`

{% hint style="info" %}
Cloud only. Required for Cloud requests.
{% endhint %}

API key required to make requests.

#### `short_answer` (boolean)

{% hint style="info" %}
JSON only. It does not affect XML output.
{% endhint %}

When `true`, shortens keys in the JSON response.

This reduces the response size.

Example (`short_answer=false`):

```json
{
  "result": [
    {
      "matches": [
        {
          "type": "spelling",
          "offset": 0,
          "length": 4,
          "message": "Spelling mistake",
          "probability": 1,
          "suggestions": [
            "hello",
            "hole",
            "help"
          ]
        }
      ]
    }
  ]
}
```

Example (`short_answer=true`):

```json
{
  "r": [
    {
      "m": [
        {
          "t": "spelling",
          "o": 0,
          "l": 4,
          "m": "Spelling mistake",
          "p": 1,
          "s": [
            "hello",
            "hole",
            "help"
          ]
        }
      ]
    }
  ]
}
```

### Boolean parameter values

When a parameter is boolean, these values are accepted.

**True** values:

* `yes`
* `y`
* `1`
* `enable`
* `on`
* `true`
* `t`

**False** values:

* `no`
* `n`
* `0`
* `disable`
* `off`
* `false`
* `f`

### Errors

See [HTTP response status codes](/v6.10.0.0/api-reference/http-response-status-codes).

Errors across commands use the same response structure.

* `error`: always `true` for an error response
* `message`: human-readable description

Example:

```json
{
  "error": true,
  "message": "Language code not found."
}
```


# HTTP response status codes

HTTP response status codes described in this section indicate whether a specific HTTP request has been successfully completed. Refer to their descriptions below when integrating WebSpellChecker into your applications and testing REST API.

* 400 Bad Request
* 403 Forbidden
* 500 Internal Server Error
* 503 Service Unavailable

#### Error response structure <a href="#httpresponsestatuscodes-errorresponsestructure" id="httpresponsestatuscodes-errorresponsestructure"></a>

The response structure below is applicable to all error messages you may receive. The difference depends on the command used and the message returned.

```javascript
{
	"error": true, 
	"is_critical": 0, 
	"message": "...", 
	"command": "..." 
}
```

### 400 Bad Request <a href="#httpresponsestatuscodes-400badrequest" id="httpresponsestatuscodes-400badrequest"></a>

The HTTP 400 Bad Request response status code indicates that the server cannot or will not process the request due to something that is perceived to be a client error.

**Possible cause**

* Incorrect syntax;
* Incorrect spelling of command, parameter, or value name.

**Remediation**

* Check the command correctness,
* Verify if the request command syntax is correct, and the command is not empty,
* Make sure the request message is framed correctly.

#### Example 1.1. Command error issue <a href="#httpresponsestatuscodes-example1.1.commanderrorissue" id="httpresponsestatuscodes-example1.1.commanderrorissue"></a>

For example, the following has an error in "check\_spelling" command name:

```javascript
{ 
	"error": true, 
	"is_critical": 0, 
	"message": "The command value 'check_spellin' for 'cmd' parameter is unknown. 
	Check available commands. Contact  for more details.", 
	"command": "check_spellin" 
}
```

**Remediation**: Specify a correct command name. Refer to the list of available commands in [HTTP API](/v6.10.0.0/api-reference/overview) documentation.

#### Example 1.2. Unspecified command <a href="#httpresponsestatuscodes-example1.2.unspecifiedcommand" id="httpresponsestatuscodes-example1.2.unspecifiedcommand"></a>

For example, the command in the request wasn't specified:

```javascript
{ 
	"error": true, 
	"is_critical": 0, 
	"message": "The command value for 'cmd' parameter is not specified in your request. 
	Contact  for more details.", 
	"command": "" 
}
```

**Remediation:** Specify the command value.

### 403 Forbidden <a href="#httpresponsestatuscodes-403forbidden" id="httpresponsestatuscodes-403forbidden"></a>

The HTTP 403 Forbidden client error status response code indicates that the server understood the request but refuses to authorize it.

**Possible causes**

Some issues usages or occurrences in the response, for example:

* Language is disabled/unallowed;
* Service on the unallowed domain;
* Command, check type unallowed; for example, grammar checking command is not available under free services.
* Product unavailable for the given license;
* Exceeded usage limitations;
* Service subscription expiration.

**Remediation**

In most cases an error description provides the exact cause of the issue and solution on how to fix the issue in response on your side.

#### Example 2.1. Incorrect service ID <a href="#httpresponsestatuscodes-example2.1.incorrectserviceid" id="httpresponsestatuscodes-example2.1.incorrectserviceid"></a>

Example of an incorrect value used for a service/customer ID parameter:

```javascript
{ 	"error": true, 
	"is_critical": 0, 
	"message": "Service key is incorrect.", "command": "check" 
}
```

**Remediation**: Check the value used in the service/customer ID parameter and make sure that you have copied and pasted the whole key without any extra characters. For older versions, please note that “**1:**” is also a part of your activation key.

#### Example 2.2. Expired subscription <a href="#httpresponsestatuscodes-example2.2.expiredsubscription" id="httpresponsestatuscodes-example2.2.expiredsubscription"></a>

Example of an expired customer ID:

```javascript
{ 	"error": true, 
	"is_critical": 0, 
	"message": "Subscription expired. Contact  for more details.",
	"command": "check" 
}
```

**Remediation**: Renew the service subscription.

#### Example 2.3. Unallowed domains issue <a href="#httpresponsestatuscodes-example2.3.unalloweddomainsissue" id="httpresponsestatuscodes-example2.3.unalloweddomainsissue"></a>

Example of an attempt to use the service on the domain(s) where the use is not granted:

```javascript
{ 
	"error": true, 
	"is_critical": 0, 
	"message": "Requests from '' are not allowed. Check domain permissions. Contact  for more details.", 
	"command": "check" 
}
```

**Remediation**: Verify the subscription covers the domain where you are using the service. Contact <support@webspellchecker.net> to whitelist a domain for your subscription.

#### Example 2.4. Subscription key issue <a href="#httpresponsestatuscodes-example2.4.subscriptionkeyissue" id="httpresponsestatuscodes-example2.4.subscriptionkeyissue"></a>

Example of the subscription key which is either turned off or does not exist yet:

```javascript
{ 
	"error": true, 
	"is_critical": 0, 
	"message": "Subscription is disabled or doesn't exist. Contact  for more details.",
	"command": "check" 
}
```

**Remediation**: Contact our support team for details. If you have just subscribed to the Cloud services, please allow up to 5-10 mins for the changes to take effect.

### 500 Internal Server Error <a href="#httpresponsestatuscodes-500internalservererror" id="httpresponsestatuscodes-500internalservererror"></a>

The HTTP 500 Internal Server Error server error response code indicates that the server encountered an unexpected condition that prevented it from fulfilling the request.

#### **Possible cause** <a href="#httpresponsestatuscodes-possiblecause" id="httpresponsestatuscodes-possiblecause"></a>

This error response is a generic "catch-all" response. Usually, this indicates the server cannot find a better 5xx error code to respond. This error usually denotes some situation when the server is not aware of how to handle it properly. It can be for example, any exceptions of the server logic including all hardware issues.

#### **Remediation** <a href="#httpresponsestatuscodes-remediation" id="httpresponsestatuscodes-remediation"></a>

If the error message doesn't give clear steps to fix the issue, contact our support team at <support@webspellchecker.net>.

### 503 Service Unavailable <a href="#httpresponsestatuscodes-503serviceunavailable" id="httpresponsestatuscodes-503serviceunavailable"></a>

The HTTP 503 Service Unavailable server error response code indicates that the server is not ready to handle the request.

#### **Possible cause** <a href="#httpresponsestatuscodes-possiblecause.1" id="httpresponsestatuscodes-possiblecause.1"></a>

You may encounter this error if the license is invalid.

#### **Remediation** <a href="#httpresponsestatuscodes-remediation.1" id="httpresponsestatuscodes-remediation.1"></a>

Verify the server license and update/request new license if it is necessary. If you are a holder of the self-hosted, Server version of WebSpellChecker, check if you have any errors in the logs which are located **AppServer/Logs** folder. Also contact our support team at <support@webspellchecker.net>.


# Check API

The **check** command combines all available check types (spelling, grammar and style) of text in a single command.

**Command name:** check

### API endpoint

See [Overview](/v6.10.0.0/api-reference/overview#api-endpoint).

### Parameters

These parameters work with any `cmd`.

| Name           | Type    | Required   | Description                                                                                                                                                                        |
| -------------- | ------- | ---------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `serviceid`    | string  | Cloud only | Cloud API key. Required for Cloud requests. Not used on-premises.                                                                                                                  |
| `format`       | string  | No         | Response format. Values: `json` (default), `xml`.                                                                                                                                  |
| `callback`     | string  | No         | JSONP wrapper function name. Use only with `format=json`.                                                                                                                          |
| `short_answer` | boolean | No         | <p>JSON only. When <code>true</code>, shortens JSON keys to reduce payload size.<br>See <a href="/pages/VXTsQ0sY5BFRLUsqxnbL#boolean-parameter-values">boolean parameters</a>.</p> |

See [Overview](/v6.10.0.0/api-reference/overview#common-parameters) for details.

Here is a list of all possible parameters and values that can be used with the **check** command.

<table><thead><tr><th width="187">Parameter</th><th>Possible values</th><th width="187">Default value</th><th>Description</th></tr></thead><tbody><tr><td>cmd</td><td><ul><li>check</li></ul></td><td></td><td>Command name for checking text for all types of writing errors.</td></tr><tr><td>lang</td><td><ul><li><a href="/pages/GUZ6cksYHij4R1JW5Nhz">Supported languages</a> (e.g. en_US)</li></ul></td><td>auto</td><td>A short code of a language which will be used for check.</td></tr><tr><td>tokens</td><td><ul><li>Array of strings, e.g. ["This is a sentence number 1.", "This is a sentence number 2."]</li></ul></td><td><br></td><td><p>A piece of text separated in tokens that will be sent for check. The text should be presented as an array of strings. Right now each string is a token which equals one sentence.</p><p>You can use either <strong>tokens</strong> or <strong>text</strong> at a time in a request.</p></td></tr><tr><td>text</td><td><ul><li>plain text</li></ul></td><td><br></td><td><p>A piece of text which will be sent for check. The text has to be in the UTF-8 encoding. Any found tags in the text will be interpreted as plain text as well.</p><p>Avoid using # and &#x26; symbols in the text.</p></td></tr><tr><td>user_dictionary</td><td><ul><li>user dictionary name (e.g. testdict)</li></ul></td><td><br></td><td>A user dictionary name which will be used during spell checking.</td></tr><tr><td>user_wordlist</td><td><ul><li>additional wordlist</li></ul></td><td><br></td><td>The list of additional comma-separated words which will be used for spell checking.</td></tr><tr><td>custom_dictionary</td><td><ul><li>custom dictionary IDs (e.g. 100694)</li></ul></td><td><p><br>For Cloud: list of all dictionaries</p><p><br>For self-hosted: empty list</p></td><td><p>Global custom dictionary ID(s) which can be used during spell checking.</p><p>Each new Dictionary on the creation obtains its unique Dictionary ID. Depending on the type of the version of product you are using, refer to <a href="/pages/Q6el9DcFxN8tyjXNHZkQ"><strong>Cloud</strong></a> or <a href="/pages/QZaTeyhvOZoa75dlfTAM"><strong>Server</strong></a> guides respectively.</p></td></tr><tr><td>ignore_all_caps</td><td><ul><li>0 – Do not ignore all words written in capital letters (e.g. UPPERCASE).</li><li>1 – Ignore all words written in capital letters.</li></ul></td><td>0</td><td>Ignore capitalized words.</td></tr><tr><td>ignore_words_with_numbers</td><td><ul><li>0 – Do not ignore words that contain numbers (e.g. Number1).</li><li>1 – Ignore words that contain numbers.</li></ul></td><td>0</td><td>Ignore words containing numbers.</td></tr><tr><td>ignore_mixed_case</td><td><ul><li>0 – Do not ignore words with mixed case letters (e.g. MixedCase).</li><li>1 – Ignore words with mixed case letters.</li></ul></td><td>0</td><td>Ignore words written with mixed case letters.</td></tr><tr><td>ignore_domain_names</td><td><ul><li>0 – Do not ignore web addresses that start with either “www”, “http:” or “https:” and end with a domain name.</li><li>1 – Ignore web addresses and domain names.</li></ul></td><td>0</td><td>Ignore domain names, web addresses.</td></tr><tr><td>min_word_length</td><td><ul><li>minimal number of letters in a word to be checked</li></ul></td><td>3</td><td>The minimal number of letters in the word which will be checked for spelling. E.g. if 3 is specified, the words with 2 letters and less will be ignored.</td></tr><tr><td>disable_spelling</td><td><ul><li>true</li><li>false</li></ul></td><td>false</td><td>Disable the check text for spelling errors.<br>See <a href="/pages/VXTsQ0sY5BFRLUsqxnbL#boolean-parameter-values">boolean parameters</a>.</td></tr><tr><td>disable_grammar</td><td><ul><li>true</li><li>false</li></ul></td><td>false<br></td><td>Disable the check text for grammar and style problems.<br>See <a href="/pages/VXTsQ0sY5BFRLUsqxnbL#boolean-parameter-values">boolean parameters</a>.</td></tr><tr><td>disable_style_guide</td><td><ul><li>true</li><li>false</li></ul></td><td>false</td><td>Disabling style guide functionality.<br>See <a href="/pages/VXTsQ0sY5BFRLUsqxnbL#boolean-parameter-values">boolean parameters</a>.</td></tr><tr><td>auto_lang_priorities</td><td>{"en":"en_US", "es":"es_ES"}</td><td><br><br></td><td>Priority of language dialect for auto-detected language code. For example, auto-detect returns "en", then American English will be used as a language for check.</td></tr><tr><td>disabled_rules</td><td><ul><li>JSON array</li></ul></td><td>[]<br></td><td>Disabling specific grammar rules IDs.</td></tr><tr><td>disabled_categories</td><td><ul><li>JSON array</li></ul></td><td>[]</td><td>Disabling specific grammar rules categories.</td></tr><tr><td>check_kit</td><td><ul><li>ai</li><li>ai_lt</li><li>lt_hs</li><li>ai_lt_hs0</li><li>ai_lt_hs1</li></ul></td><td>Depends on service default configuration</td><td><p>Enable special engine combinations:</p><ul><li><code>ai</code> AI engine</li><li><code>lt</code> LanguageTool</li><li><code>hs</code> Hunspell</li><li><code>0</code> and <code>1</code> — applicable to Hunspell only; <code>0</code> means without suggestions, <code>1</code> means with suggestions</li></ul><p><strong>Example:</strong> <code>ai_lt_hs1</code> means use AI, LanguageTool, and Hunspell with suggestions for the request.</p></td></tr><tr><td>enforce_ai</td><td><ul><li>true</li><li>false</li></ul></td><td>false</td><td>To replace the classic algorithmic engines with an AI-powered engine. It only works along with languages which supported AI.</td></tr></tbody></table>

#### Response Structure <a href="#checksommand-responsestructure" id="checksommand-responsestructure"></a>

The **result** is an array of objects which contains matches, where **matches** is also an array of objects consisting of attribute-value pairs.

The table below represents the following attribute-value pairs:

<table data-header-hidden><thead><tr><th width="158"></th><th width="139.99993896484375"></th><th width="138.39990234375"></th><th></th></tr></thead><tbody><tr><td>Attribute</td><td>Type</td><td>Value</td><td>Description</td></tr><tr><td><strong>type</strong></td><td>string</td><td><ul><li>spelling</li><li>grammar</li><li>style</li></ul></td><td>Type of the match found.</td></tr><tr><td><strong>offset</strong></td><td>unsigned number</td><td><br></td><td>Start position of a match found in a sentence/text.</td></tr><tr><td><strong>length</strong></td><td>unsigned number</td><td><br></td><td>The length of the match.</td></tr><tr><td><strong>ud</strong></td><td>boolean</td><td><ul><li>true</li><li>false</li></ul></td><td>True if a misspelled word is present in a user dictionary.</td></tr><tr><td><strong>url</strong></td><td>boolean</td><td><ul><li>true</li><li>false</li></ul></td><td>True if match is a part of the URL/URI.</td></tr><tr><td><strong>suggestions</strong></td><td>array of strings</td><td><br></td><td>Suggested corrections for spelling, grammar or style problem.</td></tr><tr><td><strong>rule</strong></td><td>string</td><td><br></td><td>A short description of the match by rule; available only for type 'grammar'.</td></tr><tr><td><strong>message</strong></td><td>string</td><td><br></td><td>Description of the problem; available only for type 'grammar'.</td></tr><tr><td><strong>probability</strong></td><td>float number</td><td>between 0.0 and 1.0</td><td>Probability of the match.</td></tr></tbody></table>

Type: Spelling

```json
{
    "result": [
        {
            "matches": [
                {
                    "type": "spelling",
                    "offset": X,
                    "length": Y,
					          "ud": true,
					          "probability": 1.0,
                    "suggestions": ["..."]
                }
            ]
        }
    ]
}
```

Type: Grammar

```json
{
    "result": [
        {
            "matches": [
                {
                    "type": "grammar",
                    "offset": X,
                    "length": Y,
                    "rule": "...",
                    "message": "...",
                    "probability": 0.Z
                    "suggestions": ["..."]
                }
            ]
        }
    ]
}
```

#### Example 1.1 \[GET]: Check request for American English text with all available check types (output in JSON) <a href="#checksommand-example1.1-get-checkrequestforamericanenglishtextwithallavailablechecktypes-outputinjso" id="checksommand-example1.1-get-checkrequestforamericanenglishtextwithallavailablechecktypes-outputinjso"></a>

Request URL (GET):

```
https://svc.webspellchecker.net/api?cmd=check&text=this sampl text demonstrates the work of the Web API service.&lang=en_US&format=json&customerid=[your-service-id]
```

```
http(s)://server_entry_point/?cmd=check&text=this sampl text demonstrates the work of the Web API service.&lang=en_US&format=json
```

**Parameters:**

* Command: *check*
* Text: *this* sample *text demonstrates the work of the Web API service.*
* Language: *en\_US*
* Format: *json*

**Request response:**

```json
{
  "result": [
    {
      "matches": [
        {
          "type": "grammar",
          "offset": 0,
          "length": 4,
          "message": "",
          "rule": "14766687526281413077",
          "description": "",
          "category": "",
          "probability": 0.9970703125,
          "suggestions": [
            "This"
          ]
        },
        {
          "type": "spelling",
          "offset": 5,
          "length": 5,
          "message": "Spelling mistake",
          "rule": "14551130629728879226",
          "probability": 0.9970703125,
          "suggestions": [
            "sample"
          ]
        }
      ]
    }
  ]
}
```

#### Example 1.2 \[GET]: Check request for American English text with all available check types (output in XML) <a href="#checksommand-example1.2-get-checkrequestforamericanenglishtextwithallavailablechecktypes-outputinxml" id="checksommand-example1.2-get-checkrequestforamericanenglishtextwithallavailablechecktypes-outputinxml"></a>

Request URL (GET):

```
https://svc.webspellchecker.net/api?cmd=check&text=this sampl text demonstrates the work of the Web API service.&lang=en_US&format=xml&customerid=[your-service-id]
```

```
http(s)://server_entry_point/?cmd=check&text=this sampl text demonstrates the work of the Web API service.&lang=en_US&format=xml
```

**Parameters:**

* Command: *check*
* Text: *this sampl text demonstrates the work of the Web API service.*
* Language: *en\_US*
* Format: *xml*

**Request response:**

```xml
<result>
	<result>
		<matches>
			<matches>
				<type>grammar</type>
				<offset>0</offset>
				<length>4</length>
				<message/>
				<rule>14766687526281413077</rule>
				<description/>
				<category/>
				<probability>0.99707</probability>
				<suggestions>
					<suggestions>This</suggestions>
				</suggestions>
			</matches>
			<type>spelling</type>
			<offset>5</offset>
			<length>5</length>
			<message>Spelling mistake</message>
			<rule>14551130629728879226</rule>
			<probability>0.99707</probability>
			<suggestions>
				<suggestions>sample</suggestions>
			</suggestions>
		</matches>
	</result>
</result>
```

#### Example 1.3 \[GET]: Check request for American English text as two tokens with all available check types (output in JSON) <a href="#checksommand-example1.3-get-checkrequestforamericanenglishtextastwotokenswithallavailablechecktypes" id="checksommand-example1.3-get-checkrequestforamericanenglishtextastwotokenswithallavailablechecktypes"></a>

Request URL (GET):

```
https://svc.webspellchecker.net/api?cmd=check&tokens=["this sampl text.", " It demonstrate the work of the Web API service."]&lang=en_US&customerid=[your-service-id]
```

```
http(s)://server_entry_point/?cmd=check&tokens=["this sampl text.", " It demonstrate the work of the Web API service."]&lang=en_US
```

**Parameters:**

* Command: *check*
* Tokens: *\["this sampl text.", " It demonstrate the work of the Web API service."]*
* Language: *en\_US*
* Format: *json*

**Request response:**

```json
{
  "result": [
    {
      "matches": [
        {
          "type": "grammar",
          "offset": 0,
          "length": 4,
          "message": "This sentence does not start with an uppercase letter.",
          "rule": "UPPERCASE_SENTENCE_START",
          "description": "Checks that a sentence starts with an uppercase letter",
          "category": "CASING",
          "probability": 1.0,
          "suggestions": [
            "This"
          ]
        },
        {
          "type": "spelling",
          "offset": 5,
          "length": 5,
          "message": "Spelling mistake",
          "rule": "14551130629728879226",
          "probability": 0.943359375,
          "suggestions": [
            "sample"
          ]
        }
      ]
    },
    {
      "matches": [
        {
          "type": "grammar",
          "offset": 4,
          "length": 11,
          "message": "",
          "rule": "11156818907134265203",
          "description": "",
          "category": "",
          "probability": 0.90234375,
          "suggestions": [
            "demonstrated"
          ]
        }
      ]
    }
  ]
}
```

#### Example 1.4 \[GET]: Check request for American English text as two tokens with all available check types and shortened response (output in JSON) <a href="#checksommand-example1.4-get-checkrequestforamericanenglishtextastwotokenswithallavailablechecktypesa" id="checksommand-example1.4-get-checkrequestforamericanenglishtextastwotokenswithallavailablechecktypesa"></a>

Request URL (GET):

```
https://svc.webspellchecker.net/api?cmd=check&tokens=["this sampl text.", " It demonstrate the work of the Web API service."]&lang=en_US&short_answer=true&customerid=[your-service-id]
```

```
http(s)://server_entry_point/?cmd=check&tokens=["this sampl text.", " It demonstrate the work of the Web API service."]&lang=en_US&short_answer=true
```

**Parameters:**

* Command: *check*
* Tokens: *\["this sampl text.", " It demonstrate the work of the Web API service."]*
* Language: *en\_US*
* Format: *json*
* Short Answer: *true*

**Request response:**

```json
{
  "r": [
    {
      "m": [
        {
          "t": "grammar",
          "o": 0,
          "l": 4,
          "m": "This sentence does not start with an uppercase letter.",
          "r": "UPPERCASE_SENTENCE_START",
          "d": "Checks that a sentence starts with an uppercase letter",
          "c": "CASING",
          "p": 1.0,
          "s": [
            "This"
          ]
        },
        {
          "t": "spelling",
          "o": 5,
          "l": 5,
          "m": "Spelling mistake",
          "r": "14551130629728879226",
          "p": 0.9576822519302368,
          "s": [
            "sample"
          ]
        }
      ]
    },
    {
      "m": [
        {
          "t": "grammar",
          "o": 4,
          "l": 11,
          "m": "",
          "r": "11156818907134265203",
          "d": "",
          "c": "",
          "p": 0.9033203125,
          "s": [
            "demonstrated"
          ]
        }
      ]
    }
  ]
}
```

#### Example 1.5 \[POST]: Check request for American English text with all available check types (output in JSON) <a href="#checksommand-example1.4-post-checkrequestforamericanenglishtextwithallavailablechecktypes-outputinjs" id="checksommand-example1.4-post-checkrequestforamericanenglishtextwithallavailablechecktypes-outputinjs"></a>

Here we use the same request and parameters as described in **example 1.1** but form it as a POST request.

Request URL (POST):

```
https://svc.webspellchecker.net/api?
```

```
http(s)://server_entry_point/?
```

Body (Raw):

```
cmd=check&text=this sampl text demonstrates the work of the Web API service.&lang=en_US&format=json&customerid=[your-service-id]
```

**Request response:**

```json
{
  "result": [
    {
      "matches": [
        {
          "type": "grammar",
          "offset": 0,
          "length": 4,
          "message": "",
          "rule": "14766687526281413077",
          "description": "",
          "category": "",
          "probability": 0.9970703125,
          "suggestions": [
            "This"
          ]
        },
        {
          "type": "spelling",
          "offset": 5,
          "length": 5,
          "message": "Spelling mistake",
          "rule": "14551130629728879226",
          "probability": 0.9970703125,
          "suggestions": [
            "sample"
          ]
        }
      ]
    }
  ]
}
```

#### Example 1.6 \[POST]: Check request for text with the auto-detected language (output in JSON) <a href="#checksommand-example1.5-post-checkrequestfortextwiththeauto-detectedlanguage-outputinjson" id="checksommand-example1.5-post-checkrequestfortextwiththeauto-detectedlanguage-outputinjson"></a>

In this POST type request, we use “auto” as a value for language and define the priorities for the language dialects. If “**en**” is detected, then British English will be used during check request.

Request body (POST):

{% tabs %}
{% tab title="JSON" %}

```json
{
  "cmd": "check",
  "text": "this sampl text demonstrates the work of the Web API service.",
  "lang": "auto",
  "format": "json",
  "serviceid": "[your-service-id]",
  "auto_lang_priorities": {
    "en": "en_GB"
  }
}
```

{% endtab %}

{% tab title="Raw" %}

```json
cmd=check&text=this sampl text demonstrates the work of the Web API service.&lang=auto&format=json&serviceid=[your-service-id]&auto_lang_priorities={"en":"en_AI"}
{

}
```

{% endtab %}
{% endtabs %}


# Spelling autocorrect API

`autocorrect` takes a single word and returns one spelling suggestion.

It also returns a localized “revert” message for the UI.

**Command name:** `autocorrect`\
**Success status:** `200 OK`

### On this page

* [Common parameters](#common-parameters)
* [Parameters](#parameters)
* [Behavior notes](#behavior-notes)
* [Request examples](#request-examples)
* [Response schema](#response-schema)
* [Errors](#errors)

**Related**: [Overview](/v6.10.0.0/api-reference/overview), [Supported languages](/v6.10.0.0/features/supported-languages)

### Common parameters

`cmd` selects the command to run.

| Name  | Type   | Required | Description            |
| ----- | ------ | -------- | ---------------------- |
| `cmd` | string | Yes      | Must be `autocorrect`. |

These parameters work with any `cmd`.

| Name           | Type    | Required   | Description                                                                                                                                                                        |
| -------------- | ------- | ---------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `serviceid`    | string  | Cloud only | Cloud API key. Required for Cloud requests. Not used on-premises.                                                                                                                  |
| `format`       | string  | No         | Response format. Values: `json` (default), `xml`.                                                                                                                                  |
| `callback`     | string  | No         | JSONP wrapper function name. Use only with `format=json`.                                                                                                                          |
| `short_answer` | boolean | No         | <p>JSON only. When <code>true</code>, shortens JSON keys to reduce payload size.<br>See <a href="/pages/VXTsQ0sY5BFRLUsqxnbL#boolean-parameter-values">boolean parameters</a>.</p> |

See [Overview](/v6.10.0.0/api-reference/overview#common-parameters) for details.

### Parameters

These are parameters specific to `cmd=autocorrect`.

| Name     | Type   | Required | Description                                                                                                               |
| -------- | ------ | -------- | ------------------------------------------------------------------------------------------------------------------------- |
| `text`   | string | Yes      | Word to autocorrect. If it contains spaces, the command returns no suggestions.                                           |
| `lang`   | string | Yes      | Language code. Use a language that supports spelling. See [Supported languages](/v6.10.0.0/features/supported-languages). |
| `locale` | string | No       | Localization for the revert message shown to the user. Accepted formats: `es`, `es-ES`, `es_ES`.                          |

### Behavior notes

* The response contains **zero or one** suggestion.
* If `text` has more than one word, you get an empty result.
* An empty result is still a `200 OK`.

### Request examples

#### Example: suggestion found

Request:

{% tabs %}
{% tab title="GET" %}

```http
GET https://endpoint/api?cmd=autocorrect&lang=en_US&text=helo
```

{% endtab %}

{% tab title="POST" %}

```http
POST https://endpoint/api
Content-Type: application/json

{
  "cmd": "autocorrect",
  "lang": "en_US",
  "text": "helo"
}
```

{% endtab %}
{% endtabs %}

Response (`200 OK`):

{% tabs %}
{% tab title="JSON" %}
Use defaults: `format=json`, `short_answer=false`.

```json
{
  "result": {
    "message": "Revert to",
    "suggestions": [
      "hello"
    ]
  }
}
```

{% endtab %}

{% tab title="Short JSON" %}
Add `short_answer=true`.

```json
{
  "r": {
    "m": "Revert to",
    "s": [
      "hello"
    ]
  }
}
```

{% endtab %}

{% tab title="XML" %}
Set `format=xml`.

```xml
<result>
  <message>Revert to</message>
  <suggestions>
    <suggestions>hello</suggestions>
  </suggestions>
</result>
```

{% endtab %}
{% endtabs %}

#### Example: no suggestions

Request:

{% tabs %}
{% tab title="GET" %}

```http
GET https://endpoint/api?cmd=autocorrect&lang=en_US&text=hello
```

{% endtab %}

{% tab title="POST" %}

```http
POST https://endpoint/api
Content-Type: application/json

{
  "cmd": "autocorrect",
  "lang": "en_US",
  "text": "hello"
}
```

{% endtab %}
{% endtabs %}

Response (`200 OK`):

{% tabs %}
{% tab title="JSON" %}
Use defaults: `format=json`, `short_answer=false`.

```json
{
  "result": {}
}
```

{% endtab %}

{% tab title="Short JSON" %}
Add `short_answer=true`.

```json
{
  "r": {}
}
```

{% endtab %}

{% tab title="XML" %}
Set `format=xml`.

```xml
<result/>
```

{% endtab %}
{% endtabs %}

### Response schema

The response is always an object with a single `result`.

#### JSON (`short_answer=false`)

```json
{
  "result": {
    "message": "Revert to",
    "suggestions": [
      "hello"
    ]
  }
}
```

* `result` (object)\
  Always present. Empty object means “no suggestions”.
* `result.suggestions` (array of strings)\
  Zero or one element.
* `result.message` (string)\
  Localized label for the revert action. Present when a suggestion exists.

#### Short JSON (`short_answer=true`)

Key mapping:

* `result` → `r`
* `message` → `m`
* `suggestions` → `s`

### Errors

Errors use the shared error format from [Overview](/v6.10.0.0/api-reference/overview#errors).

#### Language code not found (`400 Bad Request`)

```json
{
  "error": true,
  "message": "Language code not found."
}
```

#### Language has no spelling support (`403 Forbidden`)

```json
{
  "error": true,
  "message": "Command 'autocorrect' for language 'ja_JP' is not enabled or unsupported."
}
```


# Text autocomplete API

`autocomplete` takes input text and returns possible completions.

**Command name:** `autocomplete`\
**Success status:** `200 OK`

### On this page

* [Common parameters](#common-parameters)
* [Parameters](#parameters)
* [Request examples](#request-examples)
* [Response schema](#response-schema)
* [Errors](#errors)

**Related**: [Overview](/v6.10.0.0/api-reference/overview), [Supported languages](/v6.10.0.0/features/supported-languages)

### Common parameters

`cmd` selects the command to run.

| Name  | Type   | Required | Description             |
| ----- | ------ | -------- | ----------------------- |
| `cmd` | string | Yes      | Must be `autocomplete`. |

These parameters work with any `cmd`.

| Name           | Type    | Required   | Description                                                        |
| -------------- | ------- | ---------- | ------------------------------------------------------------------ |
| `serviceid`    | string  | Cloud only | Cloud API key. Required for Cloud requests. Not used on-premises.  |
| `short_answer` | boolean | No         | JSON only. When `true`, shortens JSON keys to reduce payload size. |

See [Overview](/v6.10.0.0/api-reference/overview#common-parameters) for details.

### Parameters

These are parameters specific to `cmd=autocomplete`.

| Name   | Type   | Required | Description                                                                                                                      |
| ------ | ------ | -------- | -------------------------------------------------------------------------------------------------------------------------------- |
| `text` | string | Yes      | Text to complete. The completion is returned as a suffix string. It can start with whitespace.                                   |
| `lang` | string | Yes      | Language code. Use a language where autocomplete is enabled. See [Supported languages](/v6.10.0.0/features/supported-languages). |

### Request examples

#### Example: completion found

Request:

{% tabs %}
{% tab title="GET" %}

```http
GET https://endpoint/api?cmd=autocomplete&lang=en_US&text=Welcome%20to
```

{% endtab %}

{% tab title="POST" %}

```http
POST https://endpoint/api
Content-Type: application/json

{
  "cmd": "autocomplete",
  "lang": "en_US",
  "text": "Welcome to"
}
```

{% endtab %}
{% endtabs %}

Response (`200 OK`):

{% tabs %}
{% tab title="JSON" %}
Use defaults: `format=json`, `short_answer=false`.

```json
{
  "result": {
    "suggestions": [
      " the"
    ]
  }
}
```

{% endtab %}

{% tab title="Short JSON" %}
Add `short_answer=true`.

```json
{
  "r": {
    "s": [
      " the"
    ]
  }
}
```

{% endtab %}
{% endtabs %}

#### Example: no suggestions

Request:

{% tabs %}
{% tab title="GET" %}

```http
GET https://endpoint/api?cmd=autocomplete&lang=en_US&text=Thank%20you
```

{% endtab %}

{% tab title="POST" %}

```http
POST https://endpoint/api
Content-Type: application/json

{
  "cmd": "autocomplete",
  "lang": "en_US",
  "text": "Thank you"
}
```

{% endtab %}
{% endtabs %}

Response (`200 OK`):

{% tabs %}
{% tab title="JSON" %}

```json
{
  "result": {
    "suggestions": []
  }
}
```

{% endtab %}

{% tab title="Short JSON" %}

```json
{
  "r": {
    "s": []
  }
}
```

{% endtab %}
{% endtabs %}

### Response schema

The response is always an object with a single `result`.

#### JSON (`short_answer=false`)

```json
{
  "result": {
    "suggestions": [
      " the"
    ]
  }
}
```

* `result` (object)\
  Always present.
* `result.suggestions` (array of strings)\
  May be empty. Each item is a completion suffix to append to `text`.

#### Short JSON (`short_answer=true`)

Key mapping:

* `result` → `r`
* `suggestions` → `s`

### Errors

Errors use the shared error format from [Overview](/v6.10.0.0/api-reference/overview#errors).

#### Language code not found (`400 Bad Request`)

```json
{
  "error": true,
  "message": "Language code not found."
}
```

#### Language has no autocomplete support (`403 Forbidden`)

```json
{
  "error": true,
  "message": "Command 'autocomplete' for language 'es_ES' is not enabled or unsupported."
}
```


# Custom dictionary API

Manage shared, organization-owned spellcheck dictionaries.

Use the Custom Dictionary API to manage **shared,** [**organization-owned dictionaries**](broken://pages/pm9SftAa4tPBpIODZfd0).

Words in an enabled custom dictionary are treated as **correct** during spellcheck.

**Command name:** `custom_dictionary`

See [HTTP API Overview](/v6.10.0.0/api-reference/overview) for endpoint details, request formats, and common parameters.

{% hint style="info" %}
An **access key** is **required** for this command. See [Access key](/v6.10.0.0/deployment/configuration/application-server/access-key).
{% endhint %}

### Start here

<table data-view="cards"><thead><tr><th>Page</th><th data-card-target data-type="content-ref">Link</th></tr></thead><tbody><tr><td>Overview</td><td><a href="/pages/Mjt2FyGWDATk7v4itOUR">/pages/Mjt2FyGWDATk7v4itOUR</a></td></tr><tr><td>Getting started</td><td><a href="/pages/pluff8tPUcIReliRoTjE">/pages/pluff8tPUcIReliRoTjE</a></td></tr><tr><td>Actions</td><td><a href="/pages/fHWJwDMVXMeEUOQ7SttT">/pages/fHWJwDMVXMeEUOQ7SttT</a></td></tr><tr><td>Parameters reference</td><td><a href="/pages/OGozILLCiE91UOllkvkk">/pages/OGozILLCiE91UOllkvkk</a></td></tr><tr><td>Response format</td><td><a href="/pages/DpTH6PgC4AOkcr5RoZSv">/pages/DpTH6PgC4AOkcr5RoZSv</a></td></tr><tr><td>Errors reference</td><td><a href="/pages/57FDhX28VTJ8XRXzi6Kc">/pages/57FDhX28VTJ8XRXzi6Kc</a></td></tr></tbody></table>

### When to use this vs User Dictionary

Use [User custom dictionary API](/v6.10.0.0/api-reference/user-custom-dictionary-api) when dictionaries are owned by end users.

Use this command when dictionaries are shared and managed by admins.


# Overview

What Custom Dictionary is, when to use it, and core concepts.

Use the custom dictionary API to manage **shared, organization-owned wordlists**.

Words in an enabled custom dictionary are treated as **correct** during spellcheck.

**Command name:** `custom_dictionary`

{% hint style="info" %}
An **access key** is **required** for this command. See [Access key](/v6.10.0.0/deployment/configuration/application-server/access-key).
{% endhint %}

### When to use it

Use custom dictionary when the wordlist is:

* Shared across many users
* Managed by admins or automation
* Split by language
* Part of a structured workflow (create, enable/disable, audit, delete)

Use [User custom dictionary API](/v6.10.0.0/api-reference/user-custom-dictionary-api) when the wordlist is:

* Owned by an end user
* Mutable at runtime
* Not tied to a language

### Key capabilities

* Create multiple named dictionaries.
* Assign a language per dictionary.
* Enable or disable a dictionary without deleting it.
* Add, remove, or replace a dictionary wordlist.
* List dictionaries (metadata) or fetch words (full wordlist).

### Key concepts

* **Dictionary ID (`id`)**
  * Numeric value assigned by the server.
  * Save it after `create`. You can’t manage the dictionary without it.
* **Description (`description`)**
  * Human-readable label.
  * Must be unique per account.
* **Language (`lang`)**
  * Language code like `en_US`.
  * A dictionary affects spellcheck for its language.
* **State (`state`)**
  * `true`: enabled and used in spellcheck.
  * `false`: disabled and excluded from spellcheck.

{% hint style="info" %}
Disabled dictionaries are excluded from spellcheck silently. They remain accessible via API.
{% endhint %}

### Limits and validation

#### Word rules

* Max **63** characters per word
* No spaces
* No punctuation or special characters

{% hint style="info" %}
Words are validated at request parse time. Invalid words reject the request before any action runs.
{% endhint %}

#### Limits

* Maximum **50** dictionaries per subscription
* Maximum **500 KB** per dictionary file

### Actions

<table data-view="cards"><thead><tr><th>Action</th><th data-card-target data-type="content-ref">Docs</th></tr></thead><tbody><tr><td>Create a dictionary</td><td><a href="/pages/Vog9x7eVoy8j8qZHjzlf">/pages/Vog9x7eVoy8j8qZHjzlf</a></td></tr><tr><td>Delete dictionaries</td><td><a href="/pages/pMtci7OmbVfZ5iaQ0Ukz">/pages/pMtci7OmbVfZ5iaQ0Ukz</a></td></tr><tr><td>Add or replace words</td><td><a href="/pages/ZRC1mqcYzTfR090xN0RF">/pages/ZRC1mqcYzTfR090xN0RF</a></td></tr><tr><td>Remove words</td><td><a href="/pages/fGtaCriw1GbwHq6xUWIS">/pages/fGtaCriw1GbwHq6xUWIS</a></td></tr><tr><td>Fetch a dictionary wordlist</td><td><a href="/pages/WJAEFBJ4SDMVeF5BK6u3">/pages/WJAEFBJ4SDMVeF5BK6u3</a></td></tr><tr><td>List dictionaries (metadata)</td><td><a href="/pages/XXY8O7bJw5wgqAKqyLbV">/pages/XXY8O7bJw5wgqAKqyLbV</a></td></tr><tr><td>Rename or enable/disable</td><td><a href="/pages/LLDxLJSvc5cAMJUwZ99O">/pages/LLDxLJSvc5cAMJUwZ99O</a></td></tr></tbody></table>

### Next steps

* Follow the end-to-end flow in [Getting started](/v6.10.0.0/api-reference/custom-dictionary-api/getting-started).
* Look up all inputs in [Parameters reference](/v6.10.0.0/api-reference/custom-dictionary-api/parameters-reference).
* Learn response semantics in [Response format](/v6.10.0.0/api-reference/custom-dictionary-api/response-format).

{% hint style="info" %}
`getdicts` returns metadata only.

Use `getwords` to fetch the actual word list.
{% endhint %}


# Getting started

Create a dictionary, add words, and verify the result.

This is the fastest end-to-end flow:

1. `create` a dictionary.
2. `addwords` to seed the wordlist.
3. `getwords` to verify.
4. `getdicts` to list dictionaries and states.

If you’re new to this API, read [Overview](/v6.10.0.0/api-reference/custom-dictionary-api/overview) first.

{% stepper %}
{% step %}

### 1) Create a dictionary

Use [create](/v6.10.0.0/api-reference/custom-dictionary-api/actions/create-dictionary-create) to create a new dictionary.

Required: `lang`, `description`.

{% hint style="info" %}
Save the `id` from the response.

You need it for all follow-up requests.
{% endhint %}

Example (JSON):

```json
{
    "cmd": "custom_dictionary",
    "access_key": "...",
    "lang": "en_US",
    "action": "create",
    "description": "My first dictionary"
}
```

Example response (JSON):

```json
{
  "result": [
    {
      "id": 101565,
      "lang": "en_US",
      "description": "My first dictionary",
      "wordlist": [],
      "status": "success",
      "message": ["Dictionary created."]
    }
  ]
}
```

{% endstep %}

{% step %}

### 2) Add initial words

Use [addwords](/v6.10.0.0/api-reference/custom-dictionary-api/actions/add-list-of-words-addwords) to add a wordlist to existing dictionary.

Required: `id`, `wordlist`.

```json
{
    "cmd": "custom_dictionary",
    "access_key": "...",
    "lang": "en_US",
    "action": "addwords",
    "id": 101565,
    "wordlist": "word1,word2"
}
```

Example response:

```json
{
  "result": [
    {
      "id": 101565,
      "lang": "en_US",
      "description": "My first dictionary",
      "wordlist": ["word1", "word2"],
      "status": "success",
      "message": ["Words added."]
    }
  ]
}
```

{% endstep %}

{% step %}

### 3) Verify words

Use [getwords](/v6.10.0.0/api-reference/custom-dictionary-api/actions/get-words-from-dictionary-getwords) to fetch the full wordlist.

```json
{
    "cmd": "custom_dictionary",
    "access_key": "...",
    "action": "getwords",
    "id": 101565
}
```

Example response:

```json
{
  "result": [
    {
      "id": 101565,
      "lang": "en_US",
      "description": "My first dictionary",
      "wordlist": ["word1", "word2"],
      "count": 3,
      "status": "success",
      "message": ["Wordlist extracted."]
    }
  ]
}
```

{% endstep %}

{% step %}

### 4) List dictionaries

Use [getdicts](/v6.10.0.0/api-reference/custom-dictionary-api/actions/list-dictionaries-getdicts) to list dictionaries and their state.

```json
{
    "cmd": "custom_dictionary",
    "access_key": "...",
    "action": "getdicts",
    "id": 101565
}
```

Example response:

```json
{
  "result": [
    {
      "id": 101565,
      "lang": "en_US",
      "description": "My first dictionary",
      "count": 2,
      "state": true,
      "status": "success",
      "message": ["Dictionaries extracted."]
    }
  ]
}
```

{% hint style="info" %}
`getdicts` does not include `wordlist`.

Use `getwords` for the actual words.
{% endhint %}
{% endstep %}
{% endstepper %}

### Next

* Learn each operation in [Actions](/v6.10.0.0/api-reference/custom-dictionary-api/actions).
* See the full list of fields in [Response format](/v6.10.0.0/api-reference/custom-dictionary-api/response-format).
* Troubleshoot failures in [Errors reference](/v6.10.0.0/api-reference/custom-dictionary-api/errors-reference).


# Actions

One page per action for the Custom Dictionary API.

Pick an action:

<table data-view="cards"><thead><tr><th>Action</th><th data-card-target data-type="content-ref">Docs</th></tr></thead><tbody><tr><td>Create a dictionary</td><td><a href="/pages/Vog9x7eVoy8j8qZHjzlf">/pages/Vog9x7eVoy8j8qZHjzlf</a></td></tr><tr><td>Delete dictionaries</td><td><a href="/pages/pMtci7OmbVfZ5iaQ0Ukz">/pages/pMtci7OmbVfZ5iaQ0Ukz</a></td></tr><tr><td>Add or replace words</td><td><a href="/pages/ZRC1mqcYzTfR090xN0RF">/pages/ZRC1mqcYzTfR090xN0RF</a></td></tr><tr><td>Remove words</td><td><a href="/pages/fGtaCriw1GbwHq6xUWIS">/pages/fGtaCriw1GbwHq6xUWIS</a></td></tr><tr><td>Fetch a dictionary wordlist</td><td><a href="/pages/WJAEFBJ4SDMVeF5BK6u3">/pages/WJAEFBJ4SDMVeF5BK6u3</a></td></tr><tr><td>List dictionaries (metadata)</td><td><a href="/pages/XXY8O7bJw5wgqAKqyLbV">/pages/XXY8O7bJw5wgqAKqyLbV</a></td></tr><tr><td>Rename or enable/disable</td><td><a href="/pages/LLDxLJSvc5cAMJUwZ99O">/pages/LLDxLJSvc5cAMJUwZ99O</a></td></tr></tbody></table>

{% hint style="info" %}
An **access key** is **required** for this command. See [Access key](/v6.10.0.0/deployment/configuration/application-server/access-key).
{% endhint %}

### Common notes

* Requests use `cmd=custom_dictionary` and an `action`.
* Some actions accept multiple IDs (`delete`, `getdicts`).
* Word operations can return `status=warning` for partial success.

Useful references:

* [Parameters reference](/v6.10.0.0/api-reference/custom-dictionary-api/parameters-reference)
* [Response format](/v6.10.0.0/api-reference/custom-dictionary-api/response-format)
* [Errors reference](/v6.10.0.0/api-reference/custom-dictionary-api/errors-reference)


# Create dictionary (create)

Create a new custom dictionary.

Creates a new dictionary.

The server assigns the numeric dictionary `id`.

### What it does

* Creates an empty dictionary, or seeds it with an initial wordlist.
* Binds the dictionary to a `lang`.
* Enforces unique `description` per account.

### Required parameters

| Parameter     | Type   | Notes                      |
| ------------- | ------ | -------------------------- |
| `cmd`         | string | `custom_dictionary`        |
| `action`      | string | `create`                   |
| `lang`        | string | Example: `en_US`           |
| `description` | string | Must be unique per account |

### Optional parameters

| Parameter  | Type   | Notes                                        |
| ---------- | ------ | -------------------------------------------- |
| `wordlist` | string | Comma-separated words to seed the dictionary |
| `format`   | string | `json` (default) or `xml`                    |
| `callback` | string | JSONP wrapper (JSON only)                    |

{% hint style="info" %}
Do not pass `id` in a `create` request. The server assigns it.
{% endhint %}

### Request example

{% code overflow="wrap" fullWidth="true" %}

```
cmd=custom_dictionary&action=create&lang=en_US&description=Engineering terms&wordlist=GraphQL,Kubernetes,TypeScript
```

{% endcode %}

### Response example

```json
{
  "result": [
    {
      "id": 101565,
      "lang": "en_US",
      "description": "Engineering terms",
      "wordlist": ["GraphQL", "Kubernetes", "TypeScript"],
      "status": "success",
      "message": ["Dictionary created."]
    }
  ]
}
```

### Possible errors

* Description already used: see [Errors reference](/v6.10.0.0/api-reference/custom-dictionary-api/errors-reference).
* Dictionary limit exceeded (HTTP 403).
* Dictionary file too large (HTTP 409).

### Notes and edge cases

* `wordlist` is optional.
* Words already recognized as correct can be filtered out.
* Save the returned `id`. All follow-up actions need it.


# Delete dictionary (delete)

Permanently delete one or more dictionaries.

Deletes one or more dictionaries.

This operation is irreversible.

### What it does

* Deletes dictionaries by `id`.
* Accepts one `id` or a comma-separated list.

{% hint style="warning" %}
Delete is permanent. There is no undo.
{% endhint %}

### Required parameters

| Parameter | Type                                | Notes                                |
| --------- | ----------------------------------- | ------------------------------------ |
| `cmd`     | string                              | `custom_dictionary`                  |
| `action`  | string                              | `delete`                             |
| `id`      | integer or comma-separated integers | Example: `101565` or `101565,101566` |

### Optional parameters

| Parameter  | Type   | Notes                     |
| ---------- | ------ | ------------------------- |
| `format`   | string | `json` (default) or `xml` |
| `callback` | string | JSONP wrapper (JSON only) |

### Request example

```
cmd=custom_dictionary&action=delete&id=101565,101566
```

### Response example

```json
{
  "result": [
    {
      "id": 101565,
      "description": "Engineering terms",
      "status": "success",
      "message": ["Dictionary deleted."]
    }
  ]
}
```

### Possible errors

* Missing `id`.
* Dictionary `id` not found.

See [Errors reference](/v6.10.0.0/api-reference/custom-dictionary-api/errors-reference).

### Notes and edge cases

* Duplicate IDs are ignored.
* Use `getdicts` before delete to confirm IDs and descriptions.


# Add list of words (addwords)

Add words to a dictionary, or overwrite its entire wordlist.

Adds words to a dictionary.

Optionally replaces the entire dictionary wordlist.

### What it does

* Appends words from `wordlist` to the dictionary.
* When `overwrite=true`, replaces the entire wordlist.

### Required parameters

| Parameter  | Type    | Notes                     |
| ---------- | ------- | ------------------------- |
| `cmd`      | string  | `custom_dictionary`       |
| `action`   | string  | `addwords`                |
| `id`       | integer | Exactly one dictionary ID |
| `wordlist` | string  | Comma-separated words     |

### Optional parameters

| Parameter   | Type    | Notes                                                       |
| ----------- | ------- | ----------------------------------------------------------- |
| `overwrite` | boolean | Default: `false`. When `true`, replaces the whole wordlist. |
| `format`    | string  | `json` (default) or `xml`                                   |
| `callback`  | string  | JSONP wrapper (JSON only)                                   |

{% hint style="warning" %}
`overwrite=true` replaces the entire wordlist.

This is destructive.
{% endhint %}

### Request example (append)

```
cmd=custom_dictionary&action=addwords&id=101565&wordlist=GraphQL,Kubernetes,TypeScript
```

### Request example (overwrite)

```
cmd=custom_dictionary&action=addwords&id=101565&overwrite=true&wordlist=GraphQL,TypeScript
```

### Response example

The response `wordlist` contains only words that were newly added.

```json
{
  "result": [
    {
      "id": 101565,
      "lang": "en_US",
      "description": "Engineering terms",
      "wordlist": ["GraphQL", "Kubernetes", "TypeScript"],
      "status": "success",
      "message": ["Words added."]
    }
  ]
}
```

### Possible errors

* Missing `id` or `wordlist`.
* Multiple IDs passed (only one is allowed).
* Invalid words (length or characters).
* Dictionary file size limit exceeded (HTTP 409).

See [Errors reference](/v6.10.0.0/api-reference/custom-dictionary-api/errors-reference).

### Notes and edge cases

* Partial success is reported as `status=warning`.
* Words already present may be skipped and reported in `message`.
* Words already recognized as correct can be filtered out.


# Remove words (deletewords)

Remove words from a dictionary.

Removes words from a dictionary.

### What it does

* Deletes words listed in `wordlist`.
* Leaves the dictionary in place.

### Required parameters

| Parameter  | Type    | Notes                     |
| ---------- | ------- | ------------------------- |
| `cmd`      | string  | `custom_dictionary`       |
| `action`   | string  | `deletewords`             |
| `id`       | integer | Exactly one dictionary ID |
| `wordlist` | string  | Comma-separated words     |

### Optional parameters

| Parameter  | Type   | Notes                     |
| ---------- | ------ | ------------------------- |
| `format`   | string | `json` (default) or `xml` |
| `callback` | string | JSONP wrapper (JSON only) |

### Request example

```
cmd=custom_dictionary&action=deletewords&id=101565&wordlist=GraphQL,TypeScript
```

### Response example

The response `wordlist` contains only words that were actually removed.

```json
{
  "result": [
    {
      "id": 101565,
      "lang": "en_US",
      "description": "Engineering terms",
      "wordlist": ["GraphQL", "TypeScript"],
      "status": "success",
      "message": ["Words deleted."]
    }
  ]
}
```

### Possible errors

* Missing `id` or `wordlist`.
* Multiple IDs passed (only one is allowed).
* Invalid words (length or characters).

See [Errors reference](/v6.10.0.0/api-reference/custom-dictionary-api/errors-reference).

### Notes and edge cases

* Partial success is reported as `status=warning`.
* Words not found can be skipped and reported in `message`.


# Get words from dictionary (getwords)

Fetch the full wordlist for a dictionary.

Returns the full wordlist for one dictionary.

### What it does

* Fetches all words for one dictionary `id`.
* Returns words sorted alphabetically.
* Removes duplicates.

### Required parameters

| Parameter | Type    | Notes                     |
| --------- | ------- | ------------------------- |
| `cmd`     | string  | `custom_dictionary`       |
| `action`  | string  | `getwords`                |
| `id`      | integer | Exactly one dictionary ID |

### Optional parameters

| Parameter  | Type   | Notes                     |
| ---------- | ------ | ------------------------- |
| `format`   | string | `json` (default) or `xml` |
| `callback` | string | JSONP wrapper (JSON only) |

### Request example

```
cmd=custom_dictionary&action=getwords&id=101565
```

### Response example

```json
{
  "result": [
    {
      "id": 101565,
      "lang": "en_US",
      "description": "Engineering terms",
      "wordlist": ["GraphQL", "Kubernetes", "TypeScript"],
      "count": 3,
      "status": "success",
      "message": ["Wordlist extracted."]
    }
  ]
}
```

### Possible errors

* Missing `id`.
* Multiple IDs passed (only one is allowed).
* Dictionary `id` not found.

See [Errors reference](/v6.10.0.0/api-reference/custom-dictionary-api/errors-reference).

### Notes and edge cases

* If the stored dictionary contains unsupported words, the server can skip them.
* Use `getdicts` to list dictionaries without fetching wordlists.


# List dictionaries (getdicts)

List dictionaries or fetch metadata for specific IDs.

Returns dictionary **metadata**.

It does not include the wordlist.

### What it does

* Lists all dictionaries if `id` is omitted.
* Filters to specific dictionaries when `id` is provided.
* Returns one `result[]` element per dictionary.

{% hint style="info" %}
`getdicts` returns metadata only.

Use `getwords` to fetch the word list.
{% endhint %}

### Required parameters

| Parameter | Type   | Notes               |
| --------- | ------ | ------------------- |
| `cmd`     | string | `custom_dictionary` |
| `action`  | string | `getdicts`          |

### Optional parameters

| Parameter  | Type                                | Notes                                |
| ---------- | ----------------------------------- | ------------------------------------ |
| `id`       | integer or comma-separated integers | If omitted, returns all dictionaries |
| `format`   | string                              | `json` (default) or `xml`            |
| `callback` | string                              | JSONP wrapper (JSON only)            |

### Request example (all dictionaries)

```
cmd=custom_dictionary&action=getdicts
```

### Request example (filter by ID)

```
cmd=custom_dictionary&action=getdicts&id=101565,101566
```

### Response example

```json
{
  "result": [
    {
      "id": 101565,
      "lang": "en_US",
      "description": "Engineering terms",
      "count": 3,
      "state": true,
      "status": "success",
      "message": ["Dictionaries extracted."]
    },
    {
      "id": 101566,
      "lang": "en_US",
      "description": "Brand names",
      "count": 12,
      "state": false,
      "status": "success",
      "message": ["Dictionaries extracted."]
    }
  ]
}
```

### Possible errors

* `getdicts` can return HTTP 404 when no dictionaries exist.

See [Errors reference](/v6.10.0.0/api-reference/custom-dictionary-api/errors-reference).

### Notes and edge cases

* `count` is the number of words.
* Use `state=false` dictionaries as a “soft delete”.


# Edit dictionary metadata (edit)

Rename a dictionary or enable/disable it.

Updates a dictionary description or its enabled state.

### What it does

* Renames a dictionary (`description`).
* Enables or disables a dictionary (`state`).

### Required parameters

| Parameter | Type    | Notes                     |
| --------- | ------- | ------------------------- |
| `cmd`     | string  | `custom_dictionary`       |
| `action`  | string  | `edit`                    |
| `id`      | integer | Exactly one dictionary ID |

### Optional parameters

You must pass at least one of these.

| Parameter     | Type    | Notes                            |
| ------------- | ------- | -------------------------------- |
| `description` | string  | Must be unique per account       |
| `state`       | boolean | `true` enables, `false` disables |
| `format`      | string  | `json` (default) or `xml`        |
| `callback`    | string  | JSONP wrapper (JSON only)        |

{% hint style="info" %}
If you disable a dictionary (`state=false`), spellcheck excludes it silently.

The dictionary is still accessible via the API.
{% endhint %}

### Request example (rename)

```
cmd=custom_dictionary&action=edit&id=101565&description=Engineering and product terms
```

### Request example (disable)

```
cmd=custom_dictionary&action=edit&id=101565&state=false
```

### Response example

```json
{
  "result": [
    {
      "id": 101565,
      "description": "Engineering and product terms",
      "state": false,
      "status": "success",
      "message": ["Dictionary updated."]
    }
  ]
}
```

### Possible errors

* Missing `id`.
* Multiple IDs passed (only one is allowed).
* Neither `description` nor `state` passed.
* Description conflicts with an existing dictionary.

See [Errors reference](/v6.10.0.0/api-reference/custom-dictionary-api/errors-reference).

### Notes and edge cases

* Disabling is a safe alternative to delete.
* Description uniqueness is enforced per account.




---

[Next Page](/llms-full.txt/1)

