AI Humanizer API
for developers.
A real REST endpoint. POST your AI text, get back text that reads human, with the real GPTZero score of the result. A free key for any verified account. No card, no sales call.
Human text in under 60 seconds.
No sales call, no waiting for a key by email. Create a free account, confirm your email, open API keys in your dashboard and create a key. Then pick your language, copy the code and run it.
# Free key: create an account, confirm your email, then Dashboard > API keys
curl -X POST https://api.humangpt.io/v1/humanize \
-H "Authorization: Bearer $HUMANGPT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"Artificial intelligence has fundamentally transformed the way modern organizations approach content creation, enabling teams to produce more material in less time than ever before.","mode":"medium"}'Endpoints.
Three endpoints: humanize text, check text for AI, and read your allowance. JSON in, JSON out.
Base URL: https://api.humangpt.io/v1 (also served at https://humangpt.io/api/v1).
Authentication: Authorization: Bearer hgpt_... or x-api-key: hgpt_... on every request.
POST/humanize
Rewrites AI text so it reads like a person wrote it. Returns the rewrite, its real GPTZero score and your remaining allowance.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| text | string | required | — | The AI text to humanize. At least 15 words. Up to 1,500 words per call on a free key, 8,000 on Pro and Founder. |
| mode | string | optional | medium | How hard to rewrite: light, medium or heavy. The web tool's names work too: subtle, natural, strong. |
| purpose | string | optional | general | general, academic, essay. Pro adds article, cover letter, marketing, story, report, business, legal. |
| reading | string | optional | university | highschool or university. Pro adds doctorate and journalist. |
| freeze | string[] | optional | [] | Words or phrases to keep exactly as written: brand names, keywords, citations. |
| enhanced | boolean | optional | false | Pushes the rewrite one step harder. Pro. |
| language | string | optional | en | Language code. The engine is tuned for English, where results are best. |
| use_voice | boolean | optional | true | Apply your saved Brand Voice (Pro). Set false for a neutral rewrite. |
| premium | boolean | optional | true | Pro and Founder: set false to skip the premium engine for one call. |
Response · 200 OK
{
"id": 3812,
"object": "humanization",
"output": "AI has changed how companies make content. Teams now turn out more work in less time than they ever could before.",
"words_in": 24,
"words_out": 21,
"ai_score": 0.04,
"engine": "premium",
"resisted": false,
"message": null,
"degraded": false,
"mode": "medium",
"purpose": "general",
"reading": "university",
"plan": "pro",
"usage": {
"words_remaining": 48210,
"words_limit": 50000,
"period": "month",
"resets_at": "2026-10-11T09:14:00.000Z"
}
}engine is premium when the premium engine produced the output (Pro and Founder), standard otherwise. resisted is true when the text still read as AI after two full attempts; that call is not charged. degraded is true if the rewrite engine was unavailable and the output is unlaundered.
POST/detect
Checks a text for AI writing. Send text (required) and optionally language. Up to 8,000 words per call.
Response · 200 OK (truncated)
{
"object": "detection",
"request_id": "5f1c0a9e2b7d44c1a8e3f6b2",
"verdict": "ai",
"verdict_label": "Likely AI-generated",
"score": 0.93,
"confidence": "high",
"abstain": false,
"signals": [ { "name": "hf_ensemble", "score": 0.93, "weight": 0.7 } ],
"plan": "free",
"total_latency_ms": 2140
}GET/usage
Your plan and allowance right now. The same numbers the dashboard shows, because API calls and the website share one allowance.
Response · 200 OK
{
"object": "usage",
"plan": "free",
"key": { "prefix": "hgpt_3fa1c9d", "label": "zapier-test" },
"period": "day",
"words_used": 180,
"words_limit": 500,
"words_remaining": 320,
"month": { "words_used": 940, "words_limit": 2000 },
"runs_today": 3,
"max_words_per_request": 1500,
"requests_per_minute": 30,
"engine": "standard"
}Parameters in depth.
mode
light keeps your wording nearly intact. medium is the everyday choice. heavy rewrites hardest and is what you want when the text has to hold up under a real detector. If a result still reads as AI, try heavy before anything else.
purpose
Tells the engine what kind of writing it is, so an essay keeps its argument and a cover letter keeps its tone. Free keys: general, academic, essay. Pro adds article, cover letter, marketing, story, report, business and legal.
reading
Target reading level. Free keys: highschool, university. Pro adds doctorate and journalist.
freeze
An array of words or phrases that must come back exactly as sent: product names, target keywords, quotes. Numbers, units, citations and code are protected automatically, so you only list what is specific to you.
Free tier limits.
A free key is free for good. These limits keep it that way. API calls and the website draw on one allowance, not two.
| Free key | Pro · $19/mo | Founder · $199 once | |
|---|---|---|---|
| Words | 500 a day, 2,000 a month | 50,000 a month | 150,000 a month |
| Words per call | 1,500 | 8,000 | 8,000 |
| Requests per minute | 30 | 120 | 600 |
| Calls per day | 25 | No daily cap | No daily cap |
| Engine | Standard | Premium on every call | Premium on every call |
| Keys | 1 | Up to 10 | Up to 10 |
| Brand Voice (use_voice) | No | Yes | Yes |
Going over the rate limit returns HTTP 429 with a Retry-After header. Running out of words returns HTTP 402. On a free key the error includes an upgrade_url:
{
"error": {
"code": "quota_exceeded",
"message": "Free tier resets every 24 hours. 0 words left this day. Upgrade to Pro for 50,000 words a month.",
"words_remaining": 0,
"upgrade_url": "https://humangpt.io/pricing?src=api"
}
}| HTTP | error.code | What to do |
|---|---|---|
| 400 | invalid_request, missing_text, invalid_mode, invalid_purpose, invalid_reading | Fix the request body. The message says which field. |
| 401 | missing_api_key, invalid_api_key | Send a live key as Authorization: Bearer hgpt_... or x-api-key. |
| 402 | quota_exceeded, monthly_limit, exceeds_allowance, plan_feature | Out of words or a Pro-only option. Free keys also get upgrade_url. |
| 403 | forbidden | The account is restricted. Contact support. |
| 413 | input_too_long | More words than your plan allows in one call. Split the text or go Pro. |
| 415 | unsupported_input | Tables, forms or a language the engine cannot take. Send prose. |
| 429 | rate_limited, daily_run_limit | Too many calls. Wait for Retry-After (seconds). |
| 500 | engine_error | Retry after a few seconds. |
What developers build with it.
CMS and WordPress plugins
Humanize a draft on save, before it goes live. One POST from your plugin's server side, the rewrite comes back in the same request.
Content pipelines
Make, Zapier and n8n all have an HTTP step. Send the AI draft, write the output back to your sheet, doc or CMS.
SEO and agency tooling
Rewrite drafts in bulk while freeze keeps target keywords and brand names untouched. Every call reports words used, so billing clients is easy.
Email and outreach tools
Make sequences sound written by a person, not a template. Short texts, low latency, a real detector score on each.
Writing assistants and bots
A Slack or Discord command that humanizes the pasted text and replies with the result and its AI score.
Detection in your own app
Use /detect to flag AI text before it is published or submitted, then send the flagged part to /humanize.
How the API works under the hood.
- Same pipeline as the website. An API call runs the exact handler the web tool uses, under your plan's limits. It shows up in your dashboard history like any other run.
- Premium engine on Pro. Pro and Founder calls write dozens of candidate rewrites, score them against GPTZero, and keep the one that reads most human. If the best one still reads as AI, the engine runs a second batch and keeps the better result.
- A real score, not a guess.
ai_scorecomes from GPTZero checking the output that was actually returned. When that check is skipped for a call, it is null rather than an estimate. - Keys. Stored hashed. We can only ever see a key's first characters, so a lost key is revoked and replaced, never recovered.
- CORS. The API sends no CORS headers. Call it from your backend and keep the key out of browser code.
- Timeouts. Most calls finish in under a minute; long documents on Pro can take a few minutes. Use a 300-second client timeout.
API questions.
Straight answers.
Yes, and it is free. Create a free HumanGPT account, confirm your email, open API keys in your dashboard and create a key. Send it as Authorization: Bearer hgpt_... (or an x-api-key header). A free key draws on the same allowance as the website, 500 words a day and 2,000 a month, runs the standard engine and allows 30 requests a minute. Pro ($19 a month, or $108 a year) raises that to 50,000 words a month with the premium engine on every call, 120 requests a minute and up to ten keys.
Yes. Every API call runs the same pipeline as the tool on humangpt.io, under the same plan limits, and shows up in your account's run history. The only difference is the JSON wrapper.
The real GPTZero probability that the output reads as AI, from the check that runs after the rewrite. 0.04 means GPTZero thinks it is 4% likely to be AI. It is null when the check was skipped for that call. Lower is better.
At least 15, so the engine has something to rewrite. The maximum is 1,500 words per call on a free key and 8,000 on Pro and Founder. Longer text returns HTTP 413 input_too_long.
You get HTTP 402 with an error code (quota_exceeded, monthly_limit or exceeds_allowance) and words_remaining. Free keys also get an upgrade_url. Free words come back 24 hours after you use them. Every successful call returns usage.words_remaining, so you never need a separate request to track it.
Per key: 30 requests a minute on Free, 120 on Pro, 600 on Founder. Going over returns HTTP 429 with a Retry-After header. Free keys are also capped at 25 calls a day.
No. The API sends no CORS headers, and a key in browser code can be copied by anyone. Call it from your server, a serverless function or an automation tool, and keep the key in an environment variable.
Most calls finish in under a minute. Long documents on Pro, which check more rewrites, can take a few minutes. Set your client timeout to 300 seconds.
Pass freeze as an array of strings, for example ["HumanGPT", "Q3 revenue"]. Those words come back exactly as written. Numbers, citations, units and code are protected automatically.
One active key on a free account, up to ten on Pro and Founder. Revoke a key in your dashboard and it stops working on its next request.