Convert Word to PDF
A Word file looks different on every machine that opens it — fonts substitute, tables reflow, page breaks shift. This endpoint locks a .docx into a PDF that renders identically everywhere, from a signature-ready contract to a resume nobody can accidentally edit.
Run it online
Run this on our servers with your account. Free tools run in your browser; this one bills your KIT balance per the price above.
Why DOCX alone isn't enough
Word documents are live layouts: they depend on the fonts installed, the printer driver selected, even the regional settings of the machine rendering them. Send a .docx to a client and a two-page memo can spill onto a third page on their screen. A PDF freezes that layout permanently, which is exactly what's needed the moment a document leaves your control — for signing, filing, printing or archiving.
Who reaches for this endpoint
Back offices generating offer letters, invoices and NDAs from templates; legal and HR teams that draft in Word but must deliver a document nobody can silently alter; publishers and agencies turning drafts into client-ready deliverables. Anywhere a .docx is the working format but a PDF is the deliverable, this is the seam between the two.
What happens to your file
You post the .docx, we return a task_id immediately, and the job runs asynchronously — text, embedded images, tables, headers, footers and page breaks are rendered exactly as the source document defines them, no re-layout guessing. When it's done you're notified by signed webhook, or you can fetch the PDF from a signed link that stays valid for 24 hours.
Fitting it into a pipeline
Because the call is async and billed only on success, it drops cleanly into batch jobs: generate a hundred contracts from a mail-merge template, fire a hundred conversion requests, and let webhooks collect the finished PDFs as they land — no polling loop required, no charge for the ones that fail.
A brief note on formats
DOCX itself is a fairly young standard — Microsoft moved to the XML-based Office Open XML format in 2007, replacing the older binary .doc. PDF, by contrast, has been a fixed, portable rendering format since the early 1990s, which is precisely why the conversion direction only makes sense one way for anything meant to be final.
What you can do with it
Contract finalization
Legal drafts an agreement in Word, then converts it to PDF the moment it's ready for signature, so no clause can be edited after the fact.
Automated offer letters
HR fills a Word template with candidate data and converts each one to PDF before it reaches an inbox, keeping the branded layout intact.
Invoice batches
Finance generates monthly invoices from a DOCX template and converts the whole batch to PDF for archiving and client delivery.
Print-ready reports
A reporting tool assembles a Word document with charts and tables, then converts it to PDF so pagination never shifts on the printer's end.
FAQ
Is the Word to PDF API available now?
It's in deployment and will be available shortly; the endpoint and pricing below are final.
How is it priced?
$0.051 per request plus $0.003 per page — a small base cost plus a per-page rate, published and unchanged by volume.
Do fonts and tables stay exact?
Yes. The layout is rendered as the source document defines it — fonts, tables, headers, footers and page breaks carry over rather than being reflowed.
Is it a free API?
There's no free tier — free tiers get abused and slow everyone down. Access runs on a prepaid ForHosting KIT balance: top up from $10.00 (it never expires) and each request is charged at its published price, so a call with no balance returns HTTP 402. No subscription, no tokens, no invented credits, and a failed task is never charged.
How do I get the result?
By signed webhook when the job completes, or via a signed link that stays valid for 24 hours if you prefer to poll.
Am I charged if the conversion fails?
No. Failed tasks are retried automatically up to three times and are never billed; you get a clear error instead.
Can I convert many documents at once?
Yes — each request is one file and one task_id, so batches are just parallel requests collected asynchronously by webhook.
What happens to my file afterward?
It's deleted after the retention window and is never used for training.
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, and soon from our app, email and Telegram.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/doc/word-to-pdf \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"input":"…"}'const res = await fetch("https://api.kit.forhosting.com/doc/word-to-pdf", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"input": "…"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/doc/word-to-pdf",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"input": "…"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/doc/word-to-pdf", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"input":"…"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"input":"…"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/doc/word-to-pdf", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"input": "…"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "doc.word_to_pdf",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Limits
max_mb | 25 |
max_pages | 200 |
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |
413 | input_too_large | The file exceeds the size limit. |