Clean images, PDFs, video and RAW photos from your own code. Every account has it, Free included, with the same allowances as the website.
Create a free account, then make a key in Dashboard › API keys. Send it on every request:
Authorization: Bearer mrt_live_xxxxxxxxxxxxxxxx
Upload as multipart/form-data (field file) or as a raw request body. The cleaned file comes back as the response.
# image (JPEG, PNG, WebP) curl -X POST https://metadataremover.tools/api/v1/clean/image \ -H "Authorization: Bearer $KEY" \ -F "file=@photo.jpg" -o photo-clean.jpg # PDF curl -X POST https://metadataremover.tools/api/v1/clean/pdf \ -H "Authorization: Bearer $KEY" \ -F "file=@report.pdf" -o report-clean.pdf
// Node.js 18+
const form = new FormData();
form.append("file", new Blob([fs.readFileSync("photo.jpg")]), "photo.jpg");
const res = await fetch("https://metadataremover.tools/api/v1/clean/image", {
method: "POST",
headers: { Authorization: `Bearer ${process.env.KEY}` },
body: form,
});
console.log(res.headers.get("x-metadata-removed"), "fields removed");
fs.writeFileSync("photo-clean.jpg", Buffer.from(await res.arrayBuffer()));Images are cleaned losslessly: the pixels are never touched.
Send the file as the raw request body and its name in X-Filename. The request waits while our server cleans the file, then returns it. Video is never re-encoded, so picture and sound stay exactly the same. Each file also counts against your monthly video and RAW allowance.
# video: .mp4 .m4v .mov .mkv .webm curl -X POST https://metadataremover.tools/api/v1/clean/video \ -H "Authorization: Bearer $KEY" -H "X-Filename: clip.mp4" \ --data-binary @clip.mp4 -o clip-clean.mp4 # RAW photo: .cr2 .cr3 .nef .arw .dng .raf .orf .rw2 and more curl -X POST https://metadataremover.tools/api/v1/clean/raw \ -H "Authorization: Bearer $KEY" -H "X-Filename: IMG_0042.cr2" \ --data-binary @IMG_0042.cr2 -o IMG_0042-clean.cr2
RAW cleaning removes location, capture time, owner name, serial numbers and XMP/IPTC data. The picture data and the tags a RAW editor needs are left untouched. Nikon’s serial number is a decryption key for its own data, so it is kept; the X-Metadata-Left header names it, together with anything else that could not be removed.
Check your usage any time: GET /api/v1/usage uses up nothing. It returns your plan, what is used and left of each allowance (a limit of null means unlimited) and the largest file you can send.
Want your AI assistant to do this for you? See the MCP server.
| Plan | Images and PDFs / day | Videos / month | RAW photos / month | Largest file |
|---|---|---|---|---|
| Free | 500 | 10 | 10 | 25 MB |
| Starter | Unlimited | 100 | 100 | 100 MB |
| Pro | Unlimited | 1,000 | 1,000 | 500 MB |
| Business | Unlimited | 10,000 | 10,000 | 1000 MB |
The images-and-PDFs allowance is shared by the website, the API and MCP, and starts again at midnight UTC; video and RAW allowances start again each month. Need more? See plans
Errors are JSON: { "error": { "code": "…", "message": "…" } }
| 401 | invalid_key | The key is missing, wrong or revoked. |
| 403 | plan_no_api | Your plan does not include API access. |
| 413 | file_too_large | The file is over your plan's size limit. |
| 415 | unsupported_type | The file is not the type this endpoint accepts. |
| 422 | unreadable_file | The file is damaged or encrypted. |
| 429 | daily_quota_exceeded / job_quota_exceeded / rate_limited | Today's images-and-PDFs allowance, or this month's video or RAW allowance, is used up; or more than 120 requests a minute. |