API
Send text in, get it back reading like a person wrote it. One endpoint, billed by the words you send.
Quickstart
Create a key in the dashboard (API keys come with the API plan), then:
curl https://api.zavus.ai/v1/humanize \
-H "Authorization: Bearer $ZAVUS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"text": "In today’s fast-paced world, effective communication is more important than ever."}'
{
"text": "Communication matters more than it used to.",
"words_in": 11,
"words_out": 7
}
Authentication
Send your key as a bearer token on every request. Keys start with zv_. You see a key once, when you create it; if you lose one, revoke it and make another.
Authorization: Bearer zv_...
Keep keys on your server. Anyone with a key can use your words.
Rewrite text
POST /v1/humanize
Rewrites the text so it reads like a person wrote it. The meaning, order of ideas, headings and paragraph breaks stay the same; word choice, rhythm and sentence structure change. Send whole pieces, like a full post or email, rather than one sentence at a time.
| Field | Type | |
|---|---|---|
text | string | The text to rewrite, up to 10,000 words. Separate paragraphs with blank lines. |
The response:
text | string | The rewritten text. |
words_in | number | Words in what you sent. This is what you’re billed for. |
words_out | number | Words in the rewrite. |
JavaScript
const res = await fetch("https://api.zavus.ai/v1/humanize", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.ZAVUS_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ text: draft }),
});
if (!res.ok) throw new Error((await res.json()).message);
const { text } = await res.json();
Python
import os, requests
res = requests.post(
"https://api.zavus.ai/v1/humanize",
headers={"Authorization": f"Bearer {os.environ['ZAVUS_API_KEY']}"},
json={"text": draft},
timeout=120,
)
res.raise_for_status()
text = res.json()["text"]
Long pieces take longer. Allow up to a couple of minutes for a 10,000-word request.
Check usage
GET /v1/usage
{
"plan": "api",
"status": "active",
"words_this_period": 182340,
"included_words": 250000,
"overage_words": 0,
"billing_url": "https://api.zavus.ai/billing?t=..."
}
status is trialing, active, past_due, canceled or none. During a trial, the response also has trial_words_used and trial_words. billing_url opens billing for this account and works for 7 days.
Errors
Errors return JSON with an error code and a message you can show to a person. You’re never charged for a request that fails.
{ "error": "rate_limited", "message": "The API plan allows 300 requests a minute. Try again shortly." }
| Status | Error | What to do |
|---|---|---|
| 400 | invalid_request | Send JSON with a non-empty text string. |
| 401 | unauthorized | The key is missing, wrong or revoked. |
| 402 | no_subscription, subscription_ended, trial_limit, payment_failed | Billing needs attention. The response includes a billing_url. |
| 403 | api_plan_required | API keys need the API plan. Switch plans in the dashboard. |
| 413 | too_long | Split the text into requests of 10,000 words or fewer. |
| 429 | rate_limited | Wait for the number of seconds in the Retry-After header. |
| 502 | upstream_error | Something failed on our side. Retry with backoff. |
| 503 | warming_up | Retry after the Retry-After header. Rare. |
Limits
| Starter | API | |
|---|---|---|
| Price | $20 a month | $79 a month |
| Words included | 50,000 a month | 250,000 a month |
| After that | $0.50 per 1,000 words | $0.35 per 1,000 words |
| Requests | 30 a minute | 300 a minute |
| REST API keys | No | Yes |
| Words per request | 10,000 | 10,000 |
Words are counted by splitting on whitespace, and you’re billed for the words you send, not the words you get back.
Agents (MCP)
To use Zavus from Claude, ChatGPT, Cursor or another agent instead of your own code, add the MCP server. It works on both plans and signs you in on first use.
https://api.zavus.ai/mcp
It has two tools: humanize, which works like POST /v1/humanize, and usage, which works like GET /v1/usage.