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.

FieldType
textstringThe text to rewrite, up to 10,000 words. Separate paragraphs with blank lines.

The response:

textstringThe rewritten text.
words_innumberWords in what you sent. This is what you’re billed for.
words_outnumberWords 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." }
StatusErrorWhat to do
400invalid_requestSend JSON with a non-empty text string.
401unauthorizedThe key is missing, wrong or revoked.
402no_subscription, subscription_ended, trial_limit, payment_failedBilling needs attention. The response includes a billing_url.
403api_plan_requiredAPI keys need the API plan. Switch plans in the dashboard.
413too_longSplit the text into requests of 10,000 words or fewer.
429rate_limitedWait for the number of seconds in the Retry-After header.
502upstream_errorSomething failed on our side. Retry with backoff.
503warming_upRetry after the Retry-After header. Rare.

Limits

StarterAPI
Price$20 a month$79 a month
Words included50,000 a month250,000 a month
After that$0.50 per 1,000 words$0.35 per 1,000 words
Requests30 a minute300 a minute
REST API keysNoYes
Words per request10,00010,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.