API Documentation
Extract metadata from files using our simple and powerful API. Get started with your API key and start analyzing files programmatically.
Authentication
All API requests require an API key. You can provide it in two ways:
1. In the request header:
X-API-Key: YOUR_API_KEY_HERE
2. As a query parameter:
?key=YOUR_API_KEY_HERE
Extract Metadata
https://exiftools.com/api/v1/extract
Extract metadata from a file using a direct file upload, a URL, or a base64 data URL. Results are returned in the same response when processing finishes within a few seconds; otherwise the API answers 202 with a statusUrl to poll.
Request Parameters
{
"file": "binary_file_data", // Option 1: direct file upload
"url": "https://example.com/image.jpg", // Option 2: URL. Can be passed as POST body or query string parameter
"data_url": "data:image/jpeg;base64,/9j/4AAQ..." // Option 3: base64 data URL
// Provide exactly one of the above
}
Example Response
{
"success": true,
"status": "completed",
"fileName": "image.jpg",
"uuid": "123e4567-e89b-12d3-a456-426614174000",
"processedAt": "2026-03-15T10:31:02+00:00",
"author": "John Doe", // author, createDate, dimensions, cameraModel: only when the file has them
"createDate": "2026-03-15 10:30:00",
"fileSize": "4.2 MB",
"fileSizeBytes": 4404019,
"mimeType": "image/jpeg",
"dimensions": "8192x5464",
"cameraModel": "Canon EOS R5",
"metadata": {
"File": {
"FileType": "JPEG",
"MIMEType": "image/jpeg",
"FileSize": "4.2 MB",
"ImageWidth": 8192,
"ImageHeight": 5464,
"SHA256": "a5e50cbe66078249973d9a71230c4a8edbaedc26af11204042d3bce1f9ed4409"
},
"EXIF": {
"Make": "Canon",
"Model": "Canon EOS R5",
"DateTimeOriginal": "2026:03:15 10:30:00",
"ExposureTime": "1/1000",
"FNumber": 2.8,
"ISO": 100
},
"IPTC": {
"By-line": "John Doe",
"CopyrightNotice": "© 2026 John Doe"
}
// ... more groups: XMP, GPS, ICC_Profile, MakerNotes, Composite…
}
}
The response has the same fields as Get Extraction Results. PDF and Office files also get an embedded block, usually still "pending" right after upload: get the result again a few seconds later to see the files (see Embedded Files).
Error Responses
{
"success": false,
"error": "Invalid request parameters"
}
{
"success": false,
"error": "Invalid API key"
}
{
"success": false,
"error": "An error occurred while processing your request"
}
Get Extraction Results
https://exiftools.com/api/v1/extract/{uuid}
Retrieve the metadata extraction results for a specific UUID. Use this endpoint to check the status and get results after submitting a file or URL for processing. Requires your API key.
Request Parameters
{
"uuid": "required", // The UUID returned from the extract endpoint
"X-API-Key": "required" // API key in header, or use ?key=YOUR_API_KEY
}
Example Response (Completed)
{
"success": true,
"status": "completed",
"fileName": "image.jpg",
"uuid": "123e4567-e89b-12d3-a456-426614174000",
"processedAt": "2026-03-15T10:31:02+00:00",
"author": "John Doe", // author, createDate, dimensions, cameraModel: only when the file has them
"createDate": "2026-03-15 10:30:00",
"fileSize": "4.2 MB",
"fileSizeBytes": 4404019,
"mimeType": "image/jpeg",
"dimensions": "8192x5464",
"cameraModel": "Canon EOS R5",
"metadata": {
"File": {
"FileType": "JPEG",
"MIMEType": "image/jpeg",
"FileSize": "4.2 MB",
"ImageWidth": 8192,
"ImageHeight": 5464,
"SHA256": "a5e50cbe66078249973d9a71230c4a8edbaedc26af11204042d3bce1f9ed4409"
},
"EXIF": {
"Make": "Canon",
"Model": "Canon EOS R5",
"DateTimeOriginal": "2026:03:15 10:30:00",
"ExposureTime": "1/1000",
"FNumber": 2.8,
"ISO": 100
},
"IPTC": {
"By-line": "John Doe",
"CopyrightNotice": "© 2026 John Doe"
}
// ... more groups: XMP, GPS, ICC_Profile, MakerNotes, Composite…
},
"embedded": { // PDF and Office files only, see Embedded Files
"status": "done",
"count": 1,
"zip": "https://exiftools.com/api/v1/results/{uuid}/embedded.zip",
"items": [
{
"position": 1,
"kind": "image",
"mime": "image/jpeg",
// ...
"url": "https://exiftools.com/api/v1/results/{uuid}/embedded/1"
}
]
},
"contentCredentials": { // files with Content Credentials only, see Content Credentials
"state": "trusted_legacy",
"signer": "Adobe Inc.",
// ...
"aiGenerated": true
}
}
PDF and Office results also carry an embedded block: every file found inside the document, each with its download link, and a ZIP of all of them (see Embedded Files).
Files with Content Credentials also carry a contentCredentials block: the result of checking their C2PA signature (see Content Credentials).
author, createDate, dimensions and cameraModel appear only when the file has them. metadata is grouped the way ExifTool names the groups (File, EXIF, IPTC, XMP, GPS, ICC_Profile, Composite…); which groups and tags appear depends on the file.
Error Responses
{
"success": false,
"error": "Invalid API key"
}
Only returned when an invalid API key is provided
{
"success": false,
"error": "No extraction found with the given UUID."
}
Embedded Files
For a PDF or Office document (docx, xlsx, pptx, OpenDocument), the result lists the images, video, audio and attached files found inside it in its embedded block, each with a download link, plus a ZIP of all of them. The links need your API key; without it they are null.
https://exiftools.com/api/v1/results/{uuid}/embedded/{position}
https://exiftools.com/api/v1/results/{uuid}/embedded.zip
Example Response
"embedded": {
"status": "done", // pending | done | partial | failed
"count": 2,
"zip": "https://exiftools.com/api/v1/results/{uuid}/embedded.zip",
"items": [
{
"position": 1,
"kind": "image", // image | video | audio | document | archive | other
"mime": "image/jpeg",
"ext": "jpg",
"bytes": 64753,
"width": 1023,
"height": 158,
"page": 1, // PDF page or slide number
"name": null, // an attachment's own file name
"risky": false,
"url": "https://exiftools.com/api/v1/results/{uuid}/embedded/1"
},
{
"position": 2,
"kind": "document",
"mime": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
"ext": "xlsx",
"bytes": 18311,
"width": null,
"height": null,
"page": null,
"name": "budget.xlsx",
"risky": false,
"url": "https://exiftools.com/api/v1/results/{uuid}/embedded/2"
}
]
}
Files are found after the metadata is ready. While status is "pending", get the result again in a few seconds. "partial" means a limit was reached and only the first files are listed; "failed" means the document could not be read, for example because it needs a password.
Add ?view=1 to a file url to open images, video, audio and PDFs in the browser instead of downloading them. Files marked risky (programs, scripts, macros) always download.
Error Responses
A file url or the ZIP requested without a valid API key.
Content Credentials
Files that carry Content Credentials (C2PA) get a contentCredentials block. We check them during extraction with the official C2PA tools, offline: whether the signature holds, whether the file changed after it was signed, whether the signer is on a trust list, and what the credentials declare (AI generation, actions, the files it was made from).
Example Response
"contentCredentials": {
"state": "trusted_legacy", // trusted | trusted_legacy | valid | invalid | remote | unchecked | error
"signer": "Adobe Inc.",
"certificateName": "cai-prod",
"trustList": "itl", // c2pa (C2PA Trust List) | itl (earlier Content Credentials list)
"signedAt": "2023-10-02T16:51:02+00:00",
"timestamped": true,
"algorithm": "Ps256",
"generator": "Adobe Firefly 1.0",
"title": "Generated image",
"aiGenerated": true,
"digitalSourceTypes": ["ai"],
"actions": [
{ "action": "c2pa.created", "softwareAgent": "Adobe Firefly", "digitalSourceType": "ai" }
],
"ingredients": [],
"creator": [],
"aiTraining": [],
"checks": [
{ "code": "assertion.dataHash.match", "outcome": "success" },
{ "code": "signingCredential.trusted", "outcome": "success" },
{ "code": "signingCredential.ocsp.skipped", "outcome": "info" }
// ...
],
"manifestUrl": "https://exiftools.com/results/{uuid}/credentials?format=manifest",
"checkedAt": "2026-10-15T16:36:48+00:00"
}
state: trusted means the signer is on the C2PA Trust List; trusted_legacy, on the earlier Content Credentials list (frozen in 2026, still valid for what it signed); valid, the signature and the file are intact but the signer is on no trusted list; invalid comes with a reason: changed (the file was edited after signing), signature (the signature or the record does not check out) or expired; remote, the file points to credentials stored online, which we do not fetch; unchecked, a result from before the check. A trusted signer says who made the file, not that its content is true.
checks lists every C2PA validation result with its status code and outcome (success, info or failure). manifestUrl returns the whole C2PA manifest as JSON. Revocation is not checked online.
Remove Metadata
https://exiftools.com/api/v1/remove
Remove all metadata from a file including EXIF data, GPS location, IPTC, XMP, and other sensitive information. Upload a file directly, provide a URL, or send a base64 data URL to process. Receive a cleaned version without any embedded metadata. The cleaned file is available for download via the returned URL.
Request Parameters
{
"file": "binary_file_data", // Option 1: direct file upload
"url": "https://example.com/image.jpg", // Option 2: URL. Can be passed as POST body or query string parameter
"data_url": "data:image/jpeg;base64,/9j/4AAQ..." // Option 3: base64 data URL
// Provide exactly one of the above
}
Example Response
{
"success": true,
"status": "completed",
"uuid": "123e4567-e89b-12d3-a456-426614174000",
"downloadUrl": "https://exiftools.com/download-cleaned/123e4567-e89b-12d3-a456-426614174000"
}
The downloadUrl provides a direct link to download the cleaned file with all metadata removed. The file will be available for download for 24 hours.
Cleaning runs on a queue. When it takes longer than the request waits, the response is 202 with "status": "processing" and a statusUrl (GET /api/v1/remove/{uuid}, same API key) that returns this same payload once the file is ready. A format no cleaner on the server handles comes back with "unchanged": true and a notice — its metadata is still inside.
Error Responses
{
"success": false,
"error": "An error occurred while processing your request"
}
Code Examples
# File Upload - Using header
curl -X POST https://exiftools.com/api/v1/extract \
-H "X-API-Key: YOUR_API_KEY_HERE" \
-F "[email protected]"
# File Upload - Using query parameter
curl -X POST "https://exiftools.com/api/v1/extract?key=YOUR_API_KEY_HERE" \
-F "[email protected]"
# URL Processing - Using header
curl -X POST https://exiftools.com/api/v1/extract \
-H "X-API-Key: YOUR_API_KEY_HERE" \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com/image.jpg"}'
# URL Processing - Using query parameter
curl -X POST "https://exiftools.com/api/v1/extract?key=YOUR_API_KEY_HERE" \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com/image.jpg"}'
# Data URL (base64) - encode a local file inline - Using header
curl -X POST https://exiftools.com/api/v1/extract \
-H "X-API-Key: YOUR_API_KEY_HERE" \
-H "Content-Type: application/json" \
-d "{\"data_url\": \"data:image/jpeg;base64,$(base64 -i image.jpg)\"}"
# Data URL (base64) - encode a local file inline - Using query parameter
curl -X POST "https://exiftools.com/api/v1/extract?key=YOUR_API_KEY_HERE" \
-H "Content-Type: application/json" \
-d "{\"data_url\": \"data:image/jpeg;base64,$(base64 -i image.jpg)\"}"
# Get results by UUID - Using header
curl -X GET https://exiftools.com/api/v1/extract/123e4567-e89b-12d3-a456-426614174000 \
-H "X-API-Key: YOUR_API_KEY_HERE"
# Get results by UUID - Using query parameter
curl -X GET "https://exiftools.com/api/v1/extract/123e4567-e89b-12d3-a456-426614174000?key=YOUR_API_KEY_HERE"
# Response (immediate results)
{
"success": true,
"status": "completed",
"fileName": "image.jpg",
"uuid": "123e4567-e89b-12d3-a456-426614174000",
"processedAt": "2026-03-15T10:31:02+00:00",
"author": "John Doe", # author, createDate, dimensions, cameraModel: only when the file has them
"createDate": "2026-03-15 10:30:00",
"fileSize": "4.2 MB",
"fileSizeBytes": 4404019,
"mimeType": "image/jpeg",
"dimensions": "8192x5464",
"cameraModel": "Canon EOS R5",
"metadata": {
"File": {
"FileType": "JPEG",
"MIMEType": "image/jpeg",
"FileSize": "4.2 MB",
"ImageWidth": 8192,
"ImageHeight": 5464,
"SHA256": "a5e50cbe66078249973d9a71230c4a8edbaedc26af11204042d3bce1f9ed4409"
},
"EXIF": {
"Make": "Canon",
"Model": "Canon EOS R5",
"DateTimeOriginal": "2026:03:15 10:30:00",
"ExposureTime": "1/1000",
"FNumber": 2.8,
"ISO": 100
},
"IPTC": {
"By-line": "John Doe",
"CopyrightNotice": "© 2026 John Doe"
}
# ... more groups: XMP, GPS, ICC_Profile, MakerNotes, Composite…
}
}
# Remove Metadata - File Upload - Using header
curl -X POST https://exiftools.com/api/v1/remove \
-H "X-API-Key: YOUR_API_KEY_HERE" \
-F "[email protected]"
# Remove Metadata - File Upload - Using query parameter
curl -X POST "https://exiftools.com/api/v1/remove?key=YOUR_API_KEY_HERE" \
-F "[email protected]"
# Remove Metadata - URL Processing - Using header
curl -X POST https://exiftools.com/api/v1/remove \
-H "X-API-Key: YOUR_API_KEY_HERE" \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com/image.jpg"}'
# Remove Metadata - URL Processing - Using query parameter
curl -X POST "https://exiftools.com/api/v1/remove?key=YOUR_API_KEY_HERE" \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com/image.jpg"}'
# Remove Metadata - Data URL (base64) - Using header
curl -X POST https://exiftools.com/api/v1/remove \
-H "X-API-Key: YOUR_API_KEY_HERE" \
-H "Content-Type: application/json" \
-d "{\"data_url\": \"data:image/jpeg;base64,$(base64 -i image.jpg)\"}"
# Remove Metadata - Data URL (base64) - Using query parameter
curl -X POST "https://exiftools.com/api/v1/remove?key=YOUR_API_KEY_HERE" \
-H "Content-Type: application/json" \
-d "{\"data_url\": \"data:image/jpeg;base64,$(base64 -i image.jpg)\"}"
# Response
{
"success": true,
"status": "completed",
"uuid": "123e4567-e89b-12d3-a456-426614174000",
"downloadUrl": "https://exiftools.com/download-cleaned/123e4567-e89b-12d3-a456-426614174000"
}
import requests
# File Upload - Using header
url = "https://exiftools.com/api/v1/extract"
headers = {
"X-API-Key": "YOUR_API_KEY_HERE"
}
files = {
"file": open("image.jpg", "rb")
}
response = requests.post(url, headers=headers, files=files)
# File Upload - Using query parameter
url = "https://exiftools.com/api/v1/extract?key=YOUR_API_KEY_HERE"
files = {
"file": open("image.jpg", "rb")
}
response = requests.post(url, files=files)
# URL Processing - Using header
url = "https://exiftools.com/api/v1/extract"
headers = {
"X-API-Key": "YOUR_API_KEY_HERE",
"Content-Type": "application/json"
}
data = {
"url": "https://example.com/image.jpg"
}
response = requests.post(url, headers=headers, json=data)
# URL Processing - Using query parameter
url = "https://exiftools.com/api/v1/extract?key=YOUR_API_KEY_HERE"
headers = {
"Content-Type": "application/json"
}
data = {
"url": "https://example.com/image.jpg"
}
response = requests.post(url, headers=headers, json=data)
# Data URL (base64) - encode a local file - Using header
import base64
with open("image.jpg", "rb") as f:
encoded = base64.b64encode(f.read()).decode("utf-8")
url = "https://exiftools.com/api/v1/extract"
headers = {
"X-API-Key": "YOUR_API_KEY_HERE",
"Content-Type": "application/json"
}
data = {
"data_url": f"data:image/jpeg;base64,{encoded}"
}
response = requests.post(url, headers=headers, json=data)
# Data URL (base64) - encode a local file - Using query parameter
import base64
with open("image.jpg", "rb") as f:
encoded = base64.b64encode(f.read()).decode("utf-8")
url = "https://exiftools.com/api/v1/extract?key=YOUR_API_KEY_HERE"
headers = {
"Content-Type": "application/json"
}
data = {
"data_url": f"data:image/jpeg;base64,{encoded}"
}
response = requests.post(url, headers=headers, json=data)
# Get results by UUID - Using header
response = requests.get('https://exiftools.com/api/v1/extract/123e4567-e89b-12d3-a456-426614174000', headers={"X-API-Key": "YOUR_API_KEY_HERE"})
metadata = response.json()
# Get results by UUID - Using query parameter
response = requests.get('https://exiftools.com/api/v1/extract/123e4567-e89b-12d3-a456-426614174000?key=YOUR_API_KEY_HERE')
metadata = response.json()
# Remove Metadata - File Upload - Using header
url = "https://exiftools.com/api/v1/remove"
headers = {
"X-API-Key": "YOUR_API_KEY_HERE"
}
files = {
"file": open("image.jpg", "rb")
}
response = requests.post(url, headers=headers, files=files)
result = response.json()
# Download the cleaned file
download_url = result['downloadUrl']
cleaned_file = requests.get(download_url)
with open("image_cleaned.jpg", "wb") as f:
f.write(cleaned_file.content)
# Remove Metadata - File Upload - Using query parameter
url = "https://exiftools.com/api/v1/remove?key=YOUR_API_KEY_HERE"
files = {
"file": open("image.jpg", "rb")
}
response = requests.post(url, files=files)
result = response.json()
# Remove Metadata - URL Processing - Using header
url = "https://exiftools.com/api/v1/remove"
headers = {
"X-API-Key": "YOUR_API_KEY_HERE",
"Content-Type": "application/json"
}
data = {
"url": "https://example.com/image.jpg"
}
response = requests.post(url, headers=headers, json=data)
result = response.json()
# Remove Metadata - URL Processing - Using query parameter
url = "https://exiftools.com/api/v1/remove?key=YOUR_API_KEY_HERE"
headers = {
"Content-Type": "application/json"
}
data = {
"url": "https://example.com/image.jpg"
}
response = requests.post(url, headers=headers, json=data)
result = response.json()
# Remove Metadata - Data URL (base64) - Using header
import base64
with open("image.jpg", "rb") as f:
encoded = base64.b64encode(f.read()).decode("utf-8")
url = "https://exiftools.com/api/v1/remove"
headers = {
"X-API-Key": "YOUR_API_KEY_HERE",
"Content-Type": "application/json"
}
data = {
"data_url": f"data:image/jpeg;base64,{encoded}"
}
response = requests.post(url, headers=headers, json=data)
result = response.json()
# Remove Metadata - Data URL (base64) - Using query parameter
import base64
with open("image.jpg", "rb") as f:
encoded = base64.b64encode(f.read()).decode("utf-8")
url = "https://exiftools.com/api/v1/remove?key=YOUR_API_KEY_HERE"
headers = {
"Content-Type": "application/json"
}
data = {
"data_url": f"data:image/jpeg;base64,{encoded}"
}
response = requests.post(url, headers=headers, json=data)
result = response.json()
# Download cleaned file
cleaned_file = requests.get(result['downloadUrl'])
with open("image_cleaned.jpg", "wb") as f:
f.write(cleaned_file.content)
// File Upload - Using header
const formData = new FormData();
formData.append('file', fileInput.files[0]);
fetch('https://exiftools.com/api/v1/extract', {
method: 'POST',
headers: {
'X-API-Key': 'YOUR_API_KEY_HERE'
},
body: formData
})
.then(response => response.json())
.then(data => console.log(data));
// File Upload - Using query parameter
const formData2 = new FormData();
formData2.append('file', fileInput.files[0]);
fetch('https://exiftools.com/api/v1/extract?key=YOUR_API_KEY_HERE', {
method: 'POST',
body: formData2
})
.then(response => response.json())
.then(data => console.log(data));
// URL Processing - Using header
fetch('https://exiftools.com/api/v1/extract', {
method: 'POST',
headers: {
'X-API-Key': 'YOUR_API_KEY_HERE',
'Content-Type': 'application/json'
},
body: JSON.stringify({
url: 'https://example.com/image.jpg'
})
})
.then(response => response.json())
.then(data => console.log(data));
// URL Processing - Using query parameter
fetch('https://exiftools.com/api/v1/extract?key=YOUR_API_KEY_HERE', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
url: 'https://example.com/image.jpg'
})
})
.then(response => response.json())
.then(data => console.log(data));
// Data URL (base64) - from a File input or canvas - Using header
const reader = new FileReader();
reader.onload = () => {
fetch('https://exiftools.com/api/v1/extract', {
method: 'POST',
headers: {
'X-API-Key': 'YOUR_API_KEY_HERE',
'Content-Type': 'application/json'
},
body: JSON.stringify({
data_url: reader.result // e.g. "data:image/jpeg;base64,..."
})
})
.then(response => response.json())
.then(data => console.log(data));
};
reader.readAsDataURL(fileInput.files[0]);
// Data URL (base64) - from a File input or canvas - Using query parameter
const readerQuery = new FileReader();
readerQuery.onload = () => {
fetch('https://exiftools.com/api/v1/extract?key=YOUR_API_KEY_HERE', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
data_url: readerQuery.result // e.g. "data:image/jpeg;base64,..."
})
})
.then(response => response.json())
.then(data => console.log(data));
};
readerQuery.readAsDataURL(fileInput.files[0]);
// Get results by UUID - Using header
fetch('https://exiftools.com/api/v1/extract/123e4567-e89b-12d3-a456-426614174000', {
headers: { 'X-API-Key': 'YOUR_API_KEY_HERE' }
})
.then(response => response.json())
.then(data => console.log(data));
// Get results by UUID - Using query parameter
fetch('https://exiftools.com/api/v1/extract/123e4567-e89b-12d3-a456-426614174000?key=YOUR_API_KEY_HERE')
.then(response => response.json())
.then(data => console.log(data));
// Remove Metadata - File Upload - Using header
const removeFormData = new FormData();
removeFormData.append('file', fileInput.files[0]);
fetch('https://exiftools.com/api/v1/remove', {
method: 'POST',
headers: {
'X-API-Key': 'YOUR_API_KEY_HERE'
},
body: removeFormData
})
.then(response => response.json())
.then(data => {
// Download the cleaned file
window.location.href = data.downloadUrl;
});
// Remove Metadata - File Upload - Using query parameter
const removeFormData2 = new FormData();
removeFormData2.append('file', fileInput.files[0]);
fetch('https://exiftools.com/api/v1/remove?key=YOUR_API_KEY_HERE', {
method: 'POST',
body: removeFormData2
})
.then(response => response.json())
.then(data => console.log(data));
// Remove Metadata - URL Processing - Using header
fetch('https://exiftools.com/api/v1/remove', {
method: 'POST',
headers: {
'X-API-Key': 'YOUR_API_KEY_HERE',
'Content-Type': 'application/json'
},
body: JSON.stringify({
url: 'https://example.com/image.jpg'
})
})
.then(response => response.json())
.then(data => {
window.location.href = data.downloadUrl;
});
// Remove Metadata - URL Processing - Using query parameter
fetch('https://exiftools.com/api/v1/remove?key=YOUR_API_KEY_HERE', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
url: 'https://example.com/image.jpg'
})
})
.then(response => response.json())
.then(data => console.log(data));
// Remove Metadata - Data URL (base64) - Using header
const reader2 = new FileReader();
reader2.onload = () => {
fetch('https://exiftools.com/api/v1/remove', {
method: 'POST',
headers: {
'X-API-Key': 'YOUR_API_KEY_HERE',
'Content-Type': 'application/json'
},
body: JSON.stringify({
data_url: reader2.result
})
})
.then(response => response.json())
.then(data => {
window.location.href = data.downloadUrl;
});
};
reader2.readAsDataURL(fileInput.files[0]);
// Remove Metadata - Data URL (base64) - Using query parameter
const reader2Query = new FileReader();
reader2Query.onload = () => {
fetch('https://exiftools.com/api/v1/remove?key=YOUR_API_KEY_HERE', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
data_url: reader2Query.result
})
})
.then(response => response.json())
.then(data => {
window.location.href = data.downloadUrl;
});
};
reader2Query.readAsDataURL(fileInput.files[0]);
// File Upload - Using header
$curl = curl_init();
$file = new CURLFile('/path/to/image.jpg', 'image/jpeg', 'image.jpg');
curl_setopt_array($curl, [
CURLOPT_URL => 'https://exiftools.com/api/v1/extract',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => [
'file' => $file
],
CURLOPT_HTTPHEADER => [
'X-API-Key: YOUR_API_KEY_HERE'
]
]);
$response = curl_exec($curl);
$metadata = json_decode($response, true);
curl_close($curl);
// File Upload - Using query parameter
$curl = curl_init();
$file = new CURLFile('/path/to/image.jpg', 'image/jpeg', 'image.jpg');
curl_setopt_array($curl, [
CURLOPT_URL => 'https://exiftools.com/api/v1/extract?key=YOUR_API_KEY_HERE',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => [
'file' => $file
]
]);
$response = curl_exec($curl);
$metadata = json_decode($response, true);
curl_close($curl);
// URL Processing - Using header
$curl = curl_init();
$data = json_encode(['url' => 'https://example.com/image.jpg']);
curl_setopt_array($curl, [
CURLOPT_URL => 'https://exiftools.com/api/v1/extract',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $data,
CURLOPT_HTTPHEADER => [
'X-API-Key: YOUR_API_KEY_HERE',
'Content-Type: application/json'
]
]);
$response = curl_exec($curl);
$metadata = json_decode($response, true);
curl_close($curl);
// URL Processing - Using query parameter
$curl = curl_init();
$data = json_encode(['url' => 'https://example.com/image.jpg']);
curl_setopt_array($curl, [
CURLOPT_URL => 'https://exiftools.com/api/v1/extract?key=YOUR_API_KEY_HERE',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $data,
CURLOPT_HTTPHEADER => [
'Content-Type: application/json'
]
]);
$response = curl_exec($curl);
$metadata = json_decode($response, true);
curl_close($curl);
// Data URL (base64) - encode a local file - Using header
$curl = curl_init();
$base64 = base64_encode(file_get_contents('/path/to/image.jpg'));
$data = json_encode(['data_url' => 'data:image/jpeg;base64,' . $base64]);
curl_setopt_array($curl, [
CURLOPT_URL => 'https://exiftools.com/api/v1/extract',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $data,
CURLOPT_HTTPHEADER => [
'X-API-Key: YOUR_API_KEY_HERE',
'Content-Type: application/json'
]
]);
$response = curl_exec($curl);
$metadata = json_decode($response, true);
curl_close($curl);
// Data URL (base64) - encode a local file - Using query parameter
$curl = curl_init();
$base64 = base64_encode(file_get_contents('/path/to/image.jpg'));
$data = json_encode(['data_url' => 'data:image/jpeg;base64,' . $base64]);
curl_setopt_array($curl, [
CURLOPT_URL => 'https://exiftools.com/api/v1/extract?key=YOUR_API_KEY_HERE',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $data,
CURLOPT_HTTPHEADER => [
'Content-Type: application/json'
]
]);
$response = curl_exec($curl);
$metadata = json_decode($response, true);
curl_close($curl);
// Get results by UUID - Using header
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://exiftools.com/api/v1/extract/123e4567-e89b-12d3-a456-426614174000',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPGET => true,
CURLOPT_HTTPHEADER => ['X-API-Key: YOUR_API_KEY_HERE']
]);
$response = curl_exec($curl);
$metadata = json_decode($response, true);
curl_close($curl);
// Get results by UUID - Using query parameter
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://exiftools.com/api/v1/extract/123e4567-e89b-12d3-a456-426614174000?key=YOUR_API_KEY_HERE',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPGET => true,
]);
$response = curl_exec($curl);
$metadata = json_decode($response, true);
curl_close($curl);
// Remove Metadata - File Upload - Using header
$curl = curl_init();
$file = new CURLFile('/path/to/image.jpg', 'image/jpeg', 'image.jpg');
curl_setopt_array($curl, [
CURLOPT_URL => 'https://exiftools.com/api/v1/remove',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => [
'file' => $file
],
CURLOPT_HTTPHEADER => [
'X-API-Key: YOUR_API_KEY_HERE'
]
]);
$response = curl_exec($curl);
$result = json_decode($response, true);
curl_close($curl);
// Download the cleaned file
$downloadUrl = $result['downloadUrl'];
$cleanedContent = file_get_contents($downloadUrl);
file_put_contents('image_cleaned.jpg', $cleanedContent);
// Remove Metadata - File Upload - Using query parameter
$curl = curl_init();
$file = new CURLFile('/path/to/image.jpg', 'image/jpeg', 'image.jpg');
curl_setopt_array($curl, [
CURLOPT_URL => 'https://exiftools.com/api/v1/remove?key=YOUR_API_KEY_HERE',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => [
'file' => $file
]
]);
$response = curl_exec($curl);
$result = json_decode($response, true);
curl_close($curl);
// Remove Metadata - URL Processing - Using header
$curl = curl_init();
$data = json_encode(['url' => 'https://example.com/image.jpg']);
curl_setopt_array($curl, [
CURLOPT_URL => 'https://exiftools.com/api/v1/remove',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $data,
CURLOPT_HTTPHEADER => [
'X-API-Key: YOUR_API_KEY_HERE',
'Content-Type: application/json'
]
]);
$response = curl_exec($curl);
$result = json_decode($response, true);
curl_close($curl);
// Remove Metadata - URL Processing - Using query parameter
$curl = curl_init();
$data = json_encode(['url' => 'https://example.com/image.jpg']);
curl_setopt_array($curl, [
CURLOPT_URL => 'https://exiftools.com/api/v1/remove?key=YOUR_API_KEY_HERE',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $data,
CURLOPT_HTTPHEADER => [
'Content-Type: application/json'
]
]);
$response = curl_exec($curl);
$result = json_decode($response, true);
curl_close($curl);
// Remove Metadata - Data URL (base64) - Using header
$curl = curl_init();
$base64 = base64_encode(file_get_contents('/path/to/image.jpg'));
$data = json_encode(['data_url' => 'data:image/jpeg;base64,' . $base64]);
curl_setopt_array($curl, [
CURLOPT_URL => 'https://exiftools.com/api/v1/remove',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $data,
CURLOPT_HTTPHEADER => [
'X-API-Key: YOUR_API_KEY_HERE',
'Content-Type: application/json'
]
]);
$response = curl_exec($curl);
$result = json_decode($response, true);
curl_close($curl);
// Remove Metadata - Data URL (base64) - Using query parameter
$curl = curl_init();
$base64 = base64_encode(file_get_contents('/path/to/image.jpg'));
$data = json_encode(['data_url' => 'data:image/jpeg;base64,' . $base64]);
curl_setopt_array($curl, [
CURLOPT_URL => 'https://exiftools.com/api/v1/remove?key=YOUR_API_KEY_HERE',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $data,
CURLOPT_HTTPHEADER => [
'Content-Type: application/json'
]
]);
$response = curl_exec($curl);
$result = json_decode($response, true);
curl_close($curl);
// Download cleaned file
$cleanedContent = file_get_contents($result['downloadUrl']);
file_put_contents('image_cleaned.jpg', $cleanedContent);
require 'net/http'
require 'json'
require 'uri'
# File Upload - Using header
uri = URI('https://exiftools.com/api/v1/extract')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Post.new(uri)
request['X-API-Key'] = 'YOUR_API_KEY_HERE'
# Create multipart form data
form_data = [['file', File.open('image.jpg', 'rb')]]
request.set_form(form_data, 'multipart/form-data')
response = http.request(request)
metadata = JSON.parse(response.body)
# File Upload - Using query parameter
uri = URI('https://exiftools.com/api/v1/extract?key=YOUR_API_KEY_HERE')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Post.new(uri)
form_data = [['file', File.open('image.jpg', 'rb')]]
request.set_form(form_data, 'multipart/form-data')
response = http.request(request)
metadata = JSON.parse(response.body)
# URL Processing - Using header
uri = URI('https://exiftools.com/api/v1/extract')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Post.new(uri)
request['X-API-Key'] = 'YOUR_API_KEY_HERE'
request['Content-Type'] = 'application/json'
request.body = { url: 'https://example.com/image.jpg' }.to_json
response = http.request(request)
metadata = JSON.parse(response.body)
# URL Processing - Using query parameter
uri = URI('https://exiftools.com/api/v1/extract?key=YOUR_API_KEY_HERE')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Post.new(uri)
request['Content-Type'] = 'application/json'
request.body = { url: 'https://example.com/image.jpg' }.to_json
response = http.request(request)
metadata = JSON.parse(response.body)
# Data URL (base64) - encode a local file - Using header
require 'base64'
encoded = Base64.strict_encode64(File.binread('image.jpg'))
uri = URI('https://exiftools.com/api/v1/extract')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Post.new(uri)
request['X-API-Key'] = 'YOUR_API_KEY_HERE'
request['Content-Type'] = 'application/json'
request.body = { data_url: "data:image/jpeg;base64,#{encoded}" }.to_json
response = http.request(request)
metadata = JSON.parse(response.body)
# Data URL (base64) - encode a local file - Using query parameter
require 'base64'
encoded = Base64.strict_encode64(File.binread('image.jpg'))
uri = URI('https://exiftools.com/api/v1/extract?key=YOUR_API_KEY_HERE')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Post.new(uri)
request['Content-Type'] = 'application/json'
request.body = { data_url: "data:image/jpeg;base64,#{encoded}" }.to_json
response = http.request(request)
metadata = JSON.parse(response.body)
# Alternative using HTTParty gem (if available)
# require 'httparty'
#
# # File Upload
# response = HTTParty.post('https://exiftools.com/api/v1/extract',
# headers: { 'X-API-Key' => 'YOUR_API_KEY_HERE' },
# body: { file: File.open('image.jpg', 'rb') }
# )
#
# # URL Processing
# response = HTTParty.post('https://exiftools.com/api/v1/extract',
# headers: {
# 'X-API-Key' => 'YOUR_API_KEY_HERE',
# 'Content-Type' => 'application/json'
# },
# body: { url: 'https://example.com/image.jpg' }.to_json
# )
# Get results by UUID - Using header
uri = URI('https://exiftools.com/api/v1/extract/123e4567-e89b-12d3-a456-426614174000')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Get.new(uri)
request['X-API-Key'] = 'YOUR_API_KEY_HERE'
response = http.request(request)
metadata = JSON.parse(response.body)
# Get results by UUID - Using query parameter
uri = URI('https://exiftools.com/api/v1/extract/123e4567-e89b-12d3-a456-426614174000?key=YOUR_API_KEY_HERE')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Get.new(uri)
response = http.request(request)
metadata = JSON.parse(response.body)
# Remove Metadata - File Upload - Using header
uri = URI('https://exiftools.com/api/v1/remove')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Post.new(uri)
request['X-API-Key'] = 'YOUR_API_KEY_HERE'
# Create multipart form data
form_data = [['file', File.open('image.jpg', 'rb')]]
request.set_form(form_data, 'multipart/form-data')
response = http.request(request)
result = JSON.parse(response.body)
# Download the cleaned file
download_uri = URI(result['downloadUrl'])
cleaned_file = Net::HTTP.get(download_uri)
File.write('image_cleaned.jpg', cleaned_file)
# Remove Metadata - File Upload - Using query parameter
uri = URI('https://exiftools.com/api/v1/remove?key=YOUR_API_KEY_HERE')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Post.new(uri)
form_data = [['file', File.open('image.jpg', 'rb')]]
request.set_form(form_data, 'multipart/form-data')
response = http.request(request)
result = JSON.parse(response.body)
# Remove Metadata - URL Processing - Using header
uri = URI('https://exiftools.com/api/v1/remove')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Post.new(uri)
request['X-API-Key'] = 'YOUR_API_KEY_HERE'
request['Content-Type'] = 'application/json'
request.body = { url: 'https://example.com/image.jpg' }.to_json
response = http.request(request)
result = JSON.parse(response.body)
# Remove Metadata - URL Processing - Using query parameter
uri = URI('https://exiftools.com/api/v1/remove?key=YOUR_API_KEY_HERE')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Post.new(uri)
request['Content-Type'] = 'application/json'
request.body = { url: 'https://example.com/image.jpg' }.to_json
response = http.request(request)
result = JSON.parse(response.body)
# Remove Metadata - Data URL (base64) - Using header
require 'base64'
encoded = Base64.strict_encode64(File.binread('image.jpg'))
uri = URI('https://exiftools.com/api/v1/remove')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Post.new(uri)
request['X-API-Key'] = 'YOUR_API_KEY_HERE'
request['Content-Type'] = 'application/json'
request.body = { data_url: "data:image/jpeg;base64,#{encoded}" }.to_json
response = http.request(request)
result = JSON.parse(response.body)
# Remove Metadata - Data URL (base64) - Using query parameter
require 'base64'
encoded = Base64.strict_encode64(File.binread('image.jpg'))
uri = URI('https://exiftools.com/api/v1/remove?key=YOUR_API_KEY_HERE')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Post.new(uri)
request['Content-Type'] = 'application/json'
request.body = { data_url: "data:image/jpeg;base64,#{encoded}" }.to_json
response = http.request(request)
result = JSON.parse(response.body)
# Download cleaned file
download_uri = URI(result['downloadUrl'])
cleaned_file = Net::HTTP.get(download_uri)
File.write('image_cleaned.jpg', cleaned_file)