Edit PDF metadata
Send us a PDF and the fields you want, and this task rewrites its document properties, title, author, subject and keywords, without disturbing a single page of the content. It is built for the moment when a file is technically fine but its metadata is wrong, empty, or leaking a previous author's name.
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.
The problem it fixes
Almost every PDF carries an information dictionary: the small block of properties that shows up in a reader's Document Properties panel and that search engines, digital asset managers and e-discovery tools read first. In practice these fields are a mess. A contract exported from a word processor still says the template's author. A report generated by a script has a blank title, so libraries file it under its filename. A whitepaper about to be published still lists the intern who drafted it. The edit pdf metadata api exists to correct all of that programmatically, one field at a time or all at once, so the document announces itself the way you intend.
How the call works
You POST the document and a set of target fields to /pdf/metadata-write. Because rewriting and re-serializing a PDF is real work, the endpoint is asynchronous: it immediately returns a task_id, then the finished file arrives at your webhook or through a signed link that stays valid for twenty-four hours. You choose which fields to touch; anything you leave out is preserved exactly as it was. The original page tree, fonts, forms and signatures-by-reference are left untouched, so what comes back is the same PDF with a corrected identity.
A note on the format
PDF actually stores metadata in two places: the classic document information dictionary that dates back to the 1990s, and an XMP packet, an XML block Adobe introduced in the 2000s that modern tools increasingly prefer. When only one is updated, readers disagree with each other about who the author is. This task keeps the standard properties coherent so you do not end up with a file that shows one title in a browser preview and another in a desktop reader.
Built for pipelines
This is a task you fire and forget inside a larger flow. Stamp consistent authorship as documents leave your CMS, normalize titles across a migrated archive, or scrub personal names before publishing to the open web. Because each request is priced per document at a published rate, batching thousands of files is predictable rather than a surprise on the invoice. Failed tasks are retried three times with backoff and, if they still fail, never charged.
Access and privacy
Running the task requires prepaid balance; a request without it returns 402 rather than queuing silently. That gate is deliberate, it keeps the queue fast and free of abuse. Your files live only long enough to be processed and delivered, are removed after the retention window, and are never used to train any model.
What you can do with it
Cleaning up a migrated archive
You move a decade of PDFs into a new document management system and half of them have blank or duplicated titles. A single batch through this task sets a meaningful title on each so they index and sort correctly.
Stamping authorship on generated reports
Your platform renders monthly statements from a template that leaves the author field empty. Wire the metadata-write call into the export step so every file carries your company as author and a descriptive, dated title.
Removing personal names before publishing
A whitepaper is ready for the public site but still lists the employee who drafted it in the author field. The API replaces it with your brand before the file ever leaves your pipeline.
Improving discoverability with keywords
A research library wants its PDFs to surface for the right internal searches. Writing curated keywords into each document's metadata lets on-site and enterprise search rank them by topic rather than filename alone.
FAQ
How do I edit PDF metadata with an API?
POST the document and the fields you want, such as title, author, subject and keywords, to /pdf/metadata-write. The edit pdf metadata api returns a task_id and delivers the rewritten file to your webhook or a signed link.
Is there a free tier or trial?
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.
Which metadata fields can I set?
The standard document properties: title, author, subject and keywords, along with the producer and creation or modification hints. Any field you do not include is left exactly as it was in the original.
Does it change the actual page content?
No. Only the metadata is rewritten. The pages, fonts, layout and form fields come back byte-for-byte the same; only the document's identifying properties change.
Can I update thousands of PDFs in bulk?
Yes. Each file is its own async request priced per document, so you can queue large batches and receive each result independently as it finishes. There is no per-batch penalty.
What happens to my file after processing?
It is delivered by signed webhook or a link valid for twenty-four hours, then deleted after the retention window. Your documents are never used to train any model.
Am I charged if the task fails?
Never. A failing task is retried three times with backoff; if it still cannot complete, you get a clear error and no charge for that request.
Will removing the author name fully anonymize the PDF?
It clears the metadata author and keyword fields, which is where names most often leak. It does not alter text inside the pages, so pair it with content redaction if the body also names the person.
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/pdf/metadata-write \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"pdf":"https://ejemplo.com/documento.pdf"}'const res = await fetch("https://api.kit.forhosting.com/pdf/metadata-write", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"pdf": "https://ejemplo.com/documento.pdf"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/pdf/metadata-write",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"pdf": "https://ejemplo.com/documento.pdf"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/pdf/metadata-write", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"pdf":"https://ejemplo.com/documento.pdf"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"pdf":"https://ejemplo.com/documento.pdf"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/pdf/metadata-write", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"pdf": "https://ejemplo.com/documento.pdf"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "pdf.metadata_write",
"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. |