---
title: "Find and remove invisible Unicode (zero-width, bidi/Trojan Source, tag-character smuggling), fix line endings, trailing whitespace, tabs and smart quotes, and normalise Unicode."
method: POST
path: "/api/v1/text-cleanup"
tags: ["Text Tools"]
---

# Find and remove invisible Unicode (zero-width, bidi/Trojan Source, tag-character smuggling), fix line endings, trailing whitespace, tabs and smart quotes, and normalise Unicode.

`POST /api/v1/text-cleanup`

## Request

- Base URL: `https://programmes.net`
- URL: `https://programmes.net/api/v1/text-cleanup`
- Auth: none declared

Text Cleanup & Invisible Characters. Operations: `scan` — Report invisible and special characters, hidden tag-character text, unterminated bidi controls, line endings and normalisation. `clean` — Apply clean-ups and return the text plus counts of every change.

## Request body

- union
  - TextCleanupScan: Report invisible and special characters, hidden tag-character text, unterminated bidi controls, line endings and normalisation.
    - `operation` 'scan', required
    - `input` string: The text to inspect.
    - `options` object
  - TextCleanupClean: Apply clean-ups and return the text plus counts of every change.
    - `operation` 'clean', required
    - `input` string: The text to clean.
    - `options` object
      - `lineEndings` 'lf' | 'crlf' | 'cr' | 'keep': Line-ending style.
      - `normalize` 'NFC' | 'NFD' | 'NFKC' | 'NFKD' | 'none': Unicode normalisation form.
      - `smartQuotes` boolean: Curly quotes → straight.
      - `dashes` boolean: En/em dashes → - / --.
      - `trimTrailing` boolean: Trim trailing whitespace.
      - `tabs` 'keep' | 'to-spaces' | 'to-tabs': Convert tabs and spaces.
      - `tabWidth` integer: Tab stop width.
      - `keepEmoji` boolean: Keep joiners inside emoji and non-Latin scripts.

## Response `200`

The operation ran.

- object
  - `ok` unknown, required
  - `tool` 'text-cleanup', required
  - `operation` 'scan' | 'clean', required
  - `result` unknown, required

## Other responses

- `400`: The request is not valid (https://programmes.net/api#invalid-request); The tool has no such operation (https://programmes.net/api#unknown-operation)
- `404`: No such tool (https://programmes.net/api#unknown-tool)
- `413`: The request or its input is too large (https://programmes.net/api#content-too-large)
- `415`: The body must be JSON (https://programmes.net/api#unsupported-media-type)
- `422`: An option is missing, of the wrong type or out of range (https://programmes.net/api#invalid-options); This call needs more CPU than one API call may use (https://programmes.net/api#refused); The operation could not process the input (https://programmes.net/api#tool-error)
- `429`: Too many requests (https://programmes.net/api#rate-limited)
- `500`: Internal error (https://programmes.net/api#internal-error)

---

[API](https://skmtc.dev/programmes/apis/programmes-net-api.md) · [All operations](https://skmtc.dev/programmes/apis/programmes-net-api/llms.txt) · [OpenAPI document](https://skmtc.dev/programmes/apis/programmes-net-api/revisions/aa939784a2e6?raw)
