Start here
- Quickstart: a key, a first call and a reading of the response, in under two minutes.
- Examples: texts in the covered languages with the rules' answer and the answer with the model, side by side.
- API reference: every endpoint, every field, in eight languages. Also as openapi.json.
- Errors: every problem type, its status and what to send instead.
Guides
- Contexts: What the text is changes how it is read. Usernames are split into words and checked backwards; comments are read as prose.
- Policies: How strict to be. Four presets, or your own map of category to allow, review or block, saved on the project.
- Evasion tags: Every way a writer disguises a word is normalised and named in the response, so you can see how the filter was fooled and choose what to do about it.
- Engine versions: Versions are dated and immutable. Pin one per project or per request, read the changelog, and replay a sample before you move.
- Lists: Allow, block and reserved lists per project, from the dashboard or the API. Terms are folded the way the engine folds text, so a listed word matches its disguises too.
- Publishable keys: A key that may live in a browser or a game client, limited to /v1/check and to the origins you allow, with a per-address limit.
- Edge-only projects: A project setting that guarantees no text is ever sent to a model. The model client is not constructed, so no code path can reach it.
- Rate limits and quotas: Bursts per key per minute by plan, the monthly allowance, what happens past it, how test keys are capped, and what a key does with no plan.
- Batch checks: Up to 100 texts in one request, each with its own id, answered in order. One bad item never fails the batch.
- Feedback: Send a correction when a result is wrong. Corrections feed the lexicon, the innocent list and the calibration, never a silent change inside a pinned version.
- Perspective migration: Change the base URL and keep your client. The same path, the same JSON, the same errors, the key as ?key=.
- Privacy for developers: What the API keeps and what it never keeps, in the terms a developer needs to answer their own users and their own lawyer.
- SDKs: The JavaScript and Python clients: typed, no dependencies beyond the runtime, retries with jitter, and a batch helper for any number of texts.
- MCP server: The same engine as a Model Context Protocol server, for coding agents and assistants. Three tools, the same keys, Streamable HTTP.
Limits at a glance
| What | Limit |
|---|---|
| Endpoint | POST https://api.unprofane.com/v1/check |
| Text | 1 to 10,000 characters; 64 in the username and display_name contexts |
| Batch | Up to 100 items a request |
| Lists sent with a request | Up to 50 allow and 50 block terms, 64 characters each |
| A project's lists | Up to 5,000 terms each, 64 characters each |
| Requests a minute, per key | Hobby 120, Starter 600, Growth 3,000, Scale 12,000 |
| Test keys | 100 checks a day per account, on every plan and with none |
| Live and publishable keys | Answer on a plan, from $9 a month; with no plan, 402 subscription-required |
For agents
/llms.txt is the index and /llms-full.txt is every page on this site's docs in one Markdown file, written from the same sources as these pages. The MCP server at https://api.unprofane.com/mcp exposes check_text, check_batch and get_integration_snippet over Streamable HTTP with the same bearer keys.
4 reference pages, 14 guides.