Both clients wrap the same endpoints with the same field names as the API reference, so nothing in them can drift from the contract without the contract changing. Both retry a 429, 502, 503 or 504 with jitter and honour Retry-After; any other failure raises an error carrying the problem details and the request id.
JavaScript and TypeScript
npm install @unprofane/sdk
import { Unprofane } from '@unprofane/sdk';
const unprofane = new Unprofane(process.env.UNPROFANE_API_KEY!);
const r = await unprofane.check({ text: 'xXsh1tXx', context: 'username', policy: 'teen' });
if (!r.allowed) console.log(r.action, r.evasion, r.censored);
// Any number of texts, chunked into batches of 100, results in order.
const results = await unprofane.checkMany(comments, { context: 'comment' });
check, checkBatch, checkMany, feedback, usage, getList, putList, deleteList. Works in Node 18 and later, Bun, Deno, Workers, and browsers with a publishable key. Options: baseUrl, retries (3), timeoutMs (10,000), fetch.
Python
pip install unprofane
from unprofane import Unprofane
client = Unprofane("up_live_YOUR_KEY")
r = client.check("xXsh1tXx", context="username", policy="teen")
if not r["allowed"]:
print(r["action"], r["evasion"], r["censored"])
from unprofane import AsyncUnprofane
async with AsyncUnprofane("up_live_YOUR_KEY") as client:
results = await client.check_many(comments, context="comment", concurrency=4)
check, check_batch, check_many, feedback, usage, get_list, put_list, delete_list, sync and async. Python 3.9 and later; the only dependency is httpx.
Everything else
Eight languages of plain HTTP are in the API reference, and the MCP server gives an agent the same calls as tools.