Strip PDF metadata
Give it the metadata read from a PDF, such as Title, Author, Creator, CreationDate and an internal tracking number, and it comes back empty with a sorted list of the five names it removed. The PDF file itself is not edited. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Runs in your browser. Free, unlimited — your data never leaves this page.
Strip PDF metadata after it has been extracted from a document and before the record is shared, logged, or passed to another step. Provide the metadata block as an object, and this capability returns an empty metadata object together with an alphabetized list of the fields that were removed. It does not inspect or rewrite PDF bytes. Instead, it gives applications a small, deterministic sanitization contract that is easy to test, audit, and combine with an existing PDF reader or writer.
Provide the extracted metadata block
Start with the metadata object produced by a PDF parser, document service, or form. Its properties may use familiar PDF information names such as Title, Author, Subject, Keywords, Creator, Producer, CreationDate, or ModDate, but the capability does not restrict the vocabulary to a fixed list. Custom properties are removed too.
This matters because organizations often add internal workflow labels, template identifiers, source-system names, or export settings that can reveal more than the standard fields. Values may be strings, numbers, booleans, nulls, arrays, or nested objects because removal depends on the presence of the field, not on interpreting its content.
Understand the empty result and removal report
A successful response always contains metadata as an empty object. It also contains removed, an alphabetized array of every own enumerable field found in the supplied metadata block. Reporting the names makes sanitization observable: a caller can confirm that Author, Creator, dates, or a custom tracking property was present and was cleared without retaining the original value in the response.
Alphabetical ordering is deliberate. JavaScript objects can be assembled in different insertion orders, but equivalent sets of fields should produce the same confirmation whenever possible. The algorithm therefore enumerates the object’s own fields, sorts their names using a fixed English locale, and returns only those names.
It never traverses inherited properties, never contacts another service, and never uses a clock or random source. An empty input metadata object is valid and produces an empty removed list, which is useful for idempotent pipelines: stripping a record that has already been stripped does not fail or invent a change.
Place it correctly in a PDF workflow
Use this capability between metadata extraction and the step that writes, stores, or shares the sanitized record. If the final deliverable is a PDF file, a PDF writer must still apply the empty object to the document and remove information-dictionary or XMP properties from its bytes. This capability intentionally does not claim to edit a binary document.
That separation makes it useful when your system already owns file access but needs one consistent policy for clearing descriptive records. For example, a document intake service can read metadata, send the block here, record only the removed field names for an audit event, and instruct its writer to persist the empty replacement. Treat the removed list as confirmation of field names, not as proof that a separate PDF file was rewritten.
What you can do with it
Sanitize an extracted document record
Replace a parser-produced metadata block with an empty object before the record enters a downstream service.
Create a privacy-preserving audit event
Record which metadata field names were removed without copying their potentially sensitive values into logs.
Enforce one publishing policy
Give multiple PDF ingestion and export paths the same deterministic rule for clearing standard and custom metadata fields.
FAQ
Does this modify PDF bytes?
No. It operates on an already-extracted metadata object. Use a PDF writer to apply the empty result to a document file.
Which metadata fields are removed?
Every own enumerable field in the supplied metadata object, including standard and custom property names.
Are removed metadata values returned?
No. Only the removed field names are reported, so the response does not preserve the original values.
In what order are the removed entries listed?
Alphabetically by name, so the same set of entries always gives the same confirmation, whatever order they arrived in. Author comes before CreationDate, Creator and Title.
Are custom properties removed as well?
Yes. Every entry is cleared, not only standard ones like Title or Author. Internal workflow labels, template identifiers and source-system names go too, and those often reveal more than the standard details.
Related tools
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, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/pdf/strip-metadata \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"metadata":{"Title":"Board minutes","Author":"Example User","Creator":"Office Suite","CreationDate":"D:20260725103000Z"}}'const res = await fetch("https://api.kit.forhosting.com/pdf/strip-metadata", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"metadata": {
"Title": "Board minutes",
"Author": "Example User",
"Creator": "Office Suite",
"CreationDate": "D:20260725103000Z"
}
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/pdf/strip-metadata",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"metadata": {
"Title": "Board minutes",
"Author": "Example User",
"Creator": "Office Suite",
"CreationDate": "D:20260725103000Z"
}
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/pdf/strip-metadata", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"metadata":{"Title":"Board minutes","Author":"Example User","Creator":"Office Suite","CreationDate":"D:20260725103000Z"}}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"metadata":{"Title":"Board minutes","Author":"Example User","Creator":"Office Suite","CreationDate":"D:20260725103000Z"}}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/pdf/strip-metadata", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"metadata": {
"Title": "Board minutes",
"Author": "Example User",
"Creator": "Office Suite",
"CreationDate": "D:20260725103000Z"
}
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "pdf.strip_metadata",
"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. |
Technical notes
Provide the extracted metadata block
Place that object in the metadata field of the request. The request must contain an actual object. A string containing JSON is still a string and is rejected rather than parsed implicitly; an array is rejected because numbered entries do not represent a metadata property map. Parse any serialized JSON before calling the capability so the input contract remains explicit and predictable.
Place it correctly in a PDF workflow
A publishing workflow can apply the same operation before exposing document details through an API. Each item costs $0.002 through the API, and the deterministic, network-free implementation also supports repeatable browser-side use.
Technical questions
What happens when metadata is already empty?
The call succeeds with an empty metadata object and an empty removed array.
Can I pass a JSON string?
No. Parse it first. The metadata field must be an object, and strings or arrays produce an invalid_input error.
What does one API call cost?
Processing one metadata object costs $0.002.