/v1/submitfile, optional service, and optional reference and email. If service is omitted, humanize_only is used. One document is deducted after validation.Submit DOCX files, follow each job, receive signed completion events, and return the final file through your own website.
POST /v1/submit
x-api-key: tw_live_••••••••
file: thesis.docx
service: humanize_only01 · Setup
Buy a package with API access enabled.
Generate it once from the API keys page.
Authenticate with the x-api-key header.
Poll the job or listen for a signed webhook.
https://truewriter.ai/api/public/v102 · Reference
Every request uses your live API key. Job status and downloads are isolated to the key that created the job.
/v1/submitfile, optional service, and optional reference and email. If service is omitted, humanize_only is used. One document is deducted after validation./v1/status/{job_id}queued, processing, completed or failed. Poll every 20–30 seconds, or use a webhook instead./v1/download/{job_id}file=result, file=source or file=report&index=0 (index 0 = before, 1 = after). The returned link lasts 10 minutes./v1/balanceService values
humanize_onlyHumanize only
humanize_firstHumanize, then check
standardCheck, humanize, check
03 · Responses
All responses are JSON. Errors always return { error: string } with the status codes listed below.
{
"job_id": "9f1c3b6e-…",
"status": "queued",
"words": 2400,
"service": "humanize_only"
}{
"job_id": "9f1c3b6e-…",
"reference": "order-1024",
"status": "processing",
"service": "humanize_only",
"file_name": "paper.docx",
"ai_score_before": 88,
"ai_score_after": null,
"similarity_score": null,
"reports_available": 1,
"result_ready": false,
"created_at": "2026-09-22T18:04:11Z",
"completed_at": null
}{
"url": "https://…signed-link…",
"expires_in": 600,
"file_name": "Humanized_paper.docx"
}{
"packages": [
{
"package": "Humanize only",
"service": "humanize_only",
"api_access": true,
"documents_total": 10,
"documents_used": 2,
"documents_remaining": 8,
"expires_at": "2026-10-20T00:00:00Z"
}
],
"documents_remaining": 8
}04 · Examples
Pick a language, or open Full flow for the complete submit → poll → download integration.
curl -X POST https://truewriter.ai/api/public/v1/submit \
-H "x-api-key: tw_live_xxxxxxxxxxxxxxxx" \
-F "file=@paper.docx" \
-F "service=humanize_only" \
-F "reference=order-1024"05 · Events
Add a webhook URL to your API key from the API keys page, then copy the signing secret from the same card. We POST JSON and retry on failure.
Event
job.completed
Signature
HMAC-SHA256
Header
x-signature
{
"event": "job.completed",
"job_id": "9f1c3b6e-…",
"reference": "order-1024",
"status": "ready",
"file_name": "paper.docx",
"ai_score_before": 88,
"ai_score_after": 0,
"similarity_score": 4,
"sent_at": "2026-09-22T18:22:40Z"
}const crypto = require("crypto");
app.post("/truewriter-hook", rawJson, (req, res) => {
const expected = crypto
.createHmac("sha256", process.env.TRUEWRITER_WEBHOOK_SECRET)
.update(req.rawBody)
.digest("hex");
if (req.get("x-signature") !== expected) {
return res.status(401).end();
}
// Match your own order with "reference" (the value you sent
// at submit time). "job_id" is TrueWriter's internal id.
const { reference, status, ai_score_after } = req.body;
res.status(200).end();
});06 · Errors
400Invalid request
Wrong file type, bad service value, or outside the 400–29,000 word range.
401Authentication failed
The API key is missing, invalid or revoked.
402Balance empty
No API documents remain on an eligible package for that service.
403Request blocked
The domain or IP is not on the key's allow list, or the account is suspended.
404Job not found
The job ID does not exist or belongs to a different API key.
409File not ready
The requested result or report has not been produced yet.
429Rate limited
The key exceeded its requests-per-minute limit.
503Temporarily unavailable
Processing is paused for maintenance. Retry shortly.
Create a live key, restrict its origins, and send your first document.
Open API keys