Route media through /metadata and /scrub to get privacy-friendly files and structured metadata back at scale. Powered by ExifTool — 50+ formats including RAW and video.
curl -X POST https://metamarshal.com/api/v1/scrub \ -H "Authorization: Bearer $METAMARSHAL_KEY" \ -F "file=@kyoto_2023.heic" \ -F "profile=strip_all" \ -F "include_metadata=true"
Every incumbent passes through ExifTool’s raw, format-specific field soup. MetaMarshal returns a stable, versioned schema with consistent grouped names — location, capture, device, hidden, file, sensitive — that stay identical no matter the input format.
{
"schema_version": "2026-07.1",
"file": {
"name": "kyoto_2023.heic",
"format": "HEIC",
"bytes": 3981204,
"dimensions": [4032, 3024],
"color_profile": "Display P3",
"sha256": "9f2c…a1b8"
},
"capture": {
"timestamp": "2023-11-14T15:42:07+09:00",
"camera": "Apple iPhone 15 Pro",
"lens": "24 mm ƒ/1.78",
"settings": { "aperture": 1.78, "shutter": "1/2049", "iso": 64 }
},
"location": {
"lat": 35.0116, "lng": 135.7681,
"altitude_m": 233, "heading": "NE"
},
"device": {
"make": "Apple", "model": "iPhone 15 Pro",
"software": "iOS 17.1.1", "serial": "F2L…KQ"
},
"hidden": {
"content_credentials": true,
"maker_notes": true,
"comments": ["Shot on iPhone"],
"keywords": ["kyoto", "autumn"]
},
"sensitive": ["location", "device_serial", "embedded_thumbnail",
"owner_name", "content_credentials", "maker_notes"]
}{
"job_id": "job_8f3a…",
"status": "complete",
"files": [
{
"input": "IMG_001.jpg",
"scrubbed_url": "http://…/api/v1/files/job_8f3a…/0?exp=…&sig=…",
"removed_metadata": {
"location": { "lat": 35.01, "lng": 135.76 },
"device": "iPhone 15 Pro",
"capture": { "timestamp": "2023-11-14T15:42:07+09:00" }
}
}
]
}Post many files to /v1/batch and get a job_id back instantly. Poll the job or receive a webhook when it completes.
Results come back as a manifest of short-lived signed URLs — one scrubbed file each, plus its metadata. When the link expires, the file is gone. Zero-retention, enforced by the clock.
Every plan includes the full zero-retention API — plans differ only by the monthly credit allowance.
{
"type": "batch.completed",
"job_id": "job_8f3a…",
"status": "complete",
"file_count": 3,
"created": "2026-07-03T09:12:04.000Z",
"completed": "2026-07-03T09:12:41.000Z",
"files": [
{ "input": "IMG_001.jpg", "scrubbed_url": "https://…/api/v1/files/job_8f3a…/0?exp=…&sig=…" }
]
}