Check gender-neutral language
Give it your glossary and a draft: in the sample text, “chairman” is flagged twice with “chairperson” as the neutral choice and “fireman” once with “firefighter”. You control the list, so your house style decides. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
This gender-neutral language check takes any non-empty passage and a mapping of gendered terms to neutral alternatives, then lists every mapped term that appears in the text with its suggested replacement, occurrence count, and character positions. Editors, policy writers, educators, product teams, and compliance reviewers use the result to audit job posts, handbooks, press releases, UI strings, and classroom materials without inventing a hidden dictionary of their own. You control the glossary—chairman to chairperson, fireman to firefighter, or any house style you maintain—so the same pure engine can enforce a corporate style guide, a university inclusivity checklist, or a localized campaign brief. The path is fully deterministic: no network, no model, no date, and no random sampling.
What the gender-neutral language check reports and how matches are counted
Gender-neutral language checking answers a practical editorial question: which of my listed gendered terms appear in this draft, and what neutral alternative should I consider for each one. The capability does not ship a fixed thesaurus of occupational titles or pronouns; instead it applies the exact mapping you supply so house style, locale, and product vocabulary stay under your control. Each mapping row pairs a term—single word or multi-word phrase—with a non-empty neutral suggestion such as chairperson for chairman or police officer for policeman.
The scanner lowercases keys for comparison, keeps the first definition when the same term appears twice, and prefers longer phrases so a multi-word entry is not partially claimed by a shorter overlapping term. Every match is whole-word: the characters immediately before and after the hit must not be letters or digits, which prevents false positives inside unrelated compounds while still catching capitalised sentence starts.
If you need a full find-and-replace rewrite, use a dedicated replace tool after reviewing the flags; this page only reports what should change and what to change it to.
Where gender-neutral language checks fit in writing, teaching, and software
Communications and HR teams paste job descriptions, handbooks, and all-hands scripts to surface occupational titles that still use gendered forms against an approved neutral list before publishing. Marketing and product writers audit landing pages, email templates, and in-app microcopy so public brand language matches inclusivity guidelines without relying on a black-box model that cannot explain why a phrase was flagged. Teachers and trainers build classroom exercises around a known glossary and grade against deterministic flags rather than subjective reading alone.
Translators and localization managers keep language-specific maps so each locale enforces its own neutral alternatives without hard-coding rules into application source. Pair it with find-replace tools, overused-word detectors, readability scores, or glossary-aware translation helpers when you are assembling a small lab of free, deterministic writing utilities for forms, CMS prep, and editorial hygiene.
What you can do with it
Audit job posts and handbooks
Paste a hiring description with a house map such as chairman→chairperson and fireman→firefighter, then fix only the flagged lines before publish.
CI gates on UI strings
Run the same mapping over product copy in pull requests so banned gendered terms fail the build with exact positions and suggested neutrals.
Classroom style answer keys
Give students a fixed glossary and grade gender-neutral revisions against deterministic flags rather than subjective spot checks alone.
FAQ
How do I check gender-neutral language in a text?
Send a non-empty text string and a non-empty mapping of gendered terms to neutral alternatives (array of {term, neutral} or an object map).
What happens if the mapping is empty?
At least one term→neutral pair is required; empty arrays, empty objects, and missing mapping fields are all rejected and are not billed.
Is matching case-sensitive?
No. Matching is case-insensitive and whole-word. Chairman and chairman both match a mapping entry for chairman, and partial hits inside longer words are ignored.
Does the tool rewrite my text automatically?
No. It only flags terms and suggests neutral alternatives. Apply replacements yourself or with a separate find-replace step after you review the report.
Can my list include phrases of several words?
Yes. Each entry can be a single word or a phrase, and longer phrases win over shorter terms that overlap them, so a multi-word entry is never partly claimed by a shorter one. Only whole words are matched.
Related tools
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/write/gender-neutral-language-check \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"The chairman opened the meeting and asked every fireman on the crew to report.","mapping":[{"term":"chairman","neutral":"chairperson"},{"term":"fireman","neutral":"firefighter"},{"term":"policeman","neutral":"police officer"}]}'const res = await fetch("https://api.kit.forhosting.com/write/gender-neutral-language-check", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"text": "The chairman opened the meeting and asked every fireman on the crew to report.",
"mapping": [
{
"term": "chairman",
"neutral": "chairperson"
},
{
"term": "fireman",
"neutral": "firefighter"
},
{
"term": "policeman",
"neutral": "police officer"
}
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/write/gender-neutral-language-check",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"text": "The chairman opened the meeting and asked every fireman on the crew to report.",
"mapping": [
{
"term": "chairman",
"neutral": "chairperson"
},
{
"term": "fireman",
"neutral": "firefighter"
},
{
"term": "policeman",
"neutral": "police officer"
}
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/write/gender-neutral-language-check", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"text":"The chairman opened the meeting and asked every fireman on the crew to report.","mapping":[{"term":"chairman","neutral":"chairperson"},{"term":"fireman","neutral":"firefighter"},{"term":"policeman","neutral":"police officer"}]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"text":"The chairman opened the meeting and asked every fireman on the crew to report.","mapping":[{"term":"chairman","neutral":"chairperson"},{"term":"fireman","neutral":"firefighter"},{"term":"policeman","neutral":"police officer"}]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/write/gender-neutral-language-check", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"text": "The chairman opened the meeting and asked every fireman on the crew to report.",
"mapping": [
{
"term": "chairman",
"neutral": "chairperson"
},
{
"term": "fireman",
"neutral": "firefighter"
},
{
"term": "policeman",
"neutral": "police officer"
}
]
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "write.gender_neutral_language_check",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Limits
max_chars | 100000 |
max_mapping | 500 |
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |
Technical notes
Matching is case-insensitive and whole-word, multi-word phrases take priority over shorter substrings, and empty mappings are rejected with invalid_input so a blank glossary cannot masquerade as a clean report. Use it free in the browser while drafting, or call the API at $0.002 per successful request when CI, CMS hooks, or editorial tooling need the same flags every time.
What the gender-neutral language check reports and how matches are counted
The response echoes the source text, reports mapping_size as how many unique terms were loaded after deduplication, match_count as the total number of occurrences found, flagged_count as how many distinct terms appeared at least once, and flags as a ranked array of term, neutral, count, positions, and the first surface form matched. Terms present in the mapping but absent from the text simply do not appear in flags; a clean passage returns an empty flags array with match_count zero rather than an error. Empty text, whitespace-only paste, missing mapping, empty mapping arrays or objects, rows with blank terms or blank neutrals, oversized payloads, and non-string bodies are rejected with invalid_input.
How the text and mapping fields are read and how results stay reproducible
The value must be a non-empty string after a meaningful content check; finite numbers and bigints are stringified first so a bare identifier typed as a number still produces a stable character sequence. Empty arrays, empty objects, and missing mapping fields fail with a message that states at least one pair is required—the hard rule behind this capability. Each row is trimmed; blank terms or blank neutrals after trim are rejected by index so authors can fix the bad row without guessing. Duplicate term keys keep the first definition for a stable contract. Internally the engine sorts longer terms first, builds a covered-range mask so overlapping hits from shorter terms are skipped after a longer phrase claims those characters, and records zero-based character positions for every accepted match. The preferred text field is text, but aliases input, string, value, content, and s are accepted so query strings, spreadsheets, and typed forms can reuse the same contract without renaming columns. Booleans, plain objects, and arrays are rejected with a clear message so a mistaken JSON body does not become the word true or an unhelpful object dump. Empty string and whitespace-only paste are always invalid_input: the product promise is check gender-neutral language against a real passage, not invent a silent success for a blank submit. Length is capped at one hundred thousand characters so a runaway paste cannot monopolize a Worker; longer payloads fail with an explicit limit message rather than a truncated silent cut. The preferred mapping field is mapping, with aliases terms, glossary, replacements, and map. It must be a non-empty array of objects each containing term and neutral strings, or a non-empty plain object whose keys are gendered terms and whose values are neutral strings. Pair the free browser run on this page with the priced API when you need the identical report inside an automated pipeline or editorial CMS.
Where gender-neutral language checks fit in writing, teaching, and software
Policy and compliance reviewers attach the JSON report to change tickets as evidence that a document was scanned with a documented map before release. On this page the work runs entirely in your browser; through the API each successful analysis costs $0.002, failed validation is not charged, and nothing is stored after the response returns. That split—free interactive exploration and a priced, identical API—matches the rest of the KIT tier-A catalog and lets you move from a style-guide workshop to an automated pipeline without changing the numeric result.
Technical questions
What does the gender-neutral language check cost?
The browser tool is free. API requests use prepaid KIT balance at $0.002 per successful call; invalid input is not billed.