ExifTools.com

Документация API

Извлекайте метаданные из файлов с помощью нашего простого и мощного API. Начните с вашего ключа API и начните программный анализ файлов.

Аутентификация

Все запросы API требуют ключ API. Вы можете предоставить его двумя способами:

1. В заголовке запроса:

X-API-Key: YOUR_API_KEY_HERE

2. В качестве параметра запроса:

?key=YOUR_API_KEY_HERE
Запросить ключ API Просмотреть примеры кода

Извлечь метаданные

POST 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.

Параметры запроса

{
  "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
}

Пример ответа

{
  "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…
  }
}

Ответ содержит те же поля, что и «Получить результаты извлечения». Файлы PDF и Office также получают блок embedded, который сразу после загрузки обычно ещё в состоянии "pending": запросите результат снова через несколько секунд, чтобы увидеть файлы (см. «Встроенные файлы»).

Ответы об ошибках

400Bad Request
{
  "success": false,
  "error": "Invalid request parameters"
}
401Unauthorized
{
  "success": false,
  "error": "Invalid API key"
}
500Internal Server Error
{
  "success": false,
  "error": "An error occurred while processing your request"
}

Получить результаты извлечения

GET 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.

Параметры запроса

{
  "uuid": "required", // The UUID returned from the extract endpoint
  "X-API-Key": "required" // API key in header, or use ?key=YOUR_API_KEY
}

Пример ответа (завершено)

{
  "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 и Office также содержат блок embedded: каждый найденный в документе файл со ссылкой на скачивание и ZIP-архив со всеми файлами (см. «Встроенные файлы»).

Файлы с Content Credentials также содержат блок contentCredentials: результат проверки их подписи C2PA (см. «Content Credentials»).

author, createDate, dimensions и cameraModel появляются, только если они есть в файле. metadata сгруппированы по названиям групп ExifTool (File, EXIF, IPTC, XMP, GPS, ICC_Profile, Composite…); какие группы и теги появятся, зависит от файла.

Ответы об ошибках

401Unauthorized
{
  "success": false,
  "error": "Invalid API key"
}

Возвращается только при предоставлении недействительного ключа API

404Not Found
{
  "success": false,
  "error": "No extraction found with the given UUID."
}

Встроенные файлы

Для документа PDF или Office (docx, xlsx, pptx, OpenDocument) результат перечисляет в блоке embedded найденные внутри изображения, видео, аудио и вложенные файлы — каждый со ссылкой на скачивание, — а также ZIP-архив со всеми файлами. Для ссылок нужен ваш API-ключ; без него они равны null.

GET https://exiftools.com/api/v1/results/{uuid}/embedded/{position}
GET https://exiftools.com/api/v1/results/{uuid}/embedded.zip

Пример ответа

"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"
    }
  ]
}

Файлы ищутся после того, как метаданные готовы. Пока status равен "pending", запросите результат снова через несколько секунд. "partial" означает, что достигнут лимит и показаны только первые файлы; "failed" означает, что документ не удалось прочитать, например потому что он защищён паролем.

Добавьте ?view=1 к url файла, чтобы открыть изображения, видео, аудио и PDF в браузере, а не скачивать их. Файлы с пометкой risky (программы, скрипты, макросы) всегда скачиваются.

Ответы об ошибках

403Forbidden
A file url or the ZIP requested without a valid API key.

Content Credentials

Файлы с Content Credentials (C2PA) получают блок contentCredentials. Мы проверяем их во время извлечения официальными инструментами C2PA, офлайн: действительна ли подпись, менялся ли файл после подписания, есть ли подписант в доверенном списке и что заявлено в Content Credentials (генерация ИИ, действия, файлы, из которых создан этот файл).

Пример ответа

"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 означает, что подписант есть в C2PA Trust List; trusted_legacy — в прежнем списке Content Credentials (заморожен в 2026 году, но по-прежнему действителен для того, что было подписано); valid — подпись и файл целы, но подписанта нет ни в одном доверенном списке; invalid приходит с причиной: changed (файл отредактирован после подписания), signature (подпись или запись не проходят проверку) или expired; remote — файл ссылается на Content Credentials, хранящиеся онлайн, которые мы не загружаем; unchecked — результат, полученный до появления проверки. Доверенный подписант говорит о том, кто создал файл, а не о том, что его содержимое правдиво.

checks перечисляет все результаты проверки C2PA с кодом статуса и итогом (success, info или failure). manifestUrl возвращает весь манифест C2PA в формате JSON. Отзыв сертификатов онлайн не проверяется.

Удалить метаданные

POST https://exiftools.com/api/v1/remove

Удалите все метаданные из файла, включая данные EXIF, GPS-местоположение, IPTC, XMP и другую конфиденциальную информацию. Загрузите файл напрямую или укажите URL для обработки. Получите очищенную версию без встроенных метаданных. Очищенный файл доступен для загрузки по возвращенному URL.

Параметры запроса

{
  "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
}

Пример ответа

{
  "success": true,
  "status": "completed",
  "uuid": "123e4567-e89b-12d3-a456-426614174000",
  "downloadUrl": "https://exiftools.com/download-cleaned/123e4567-e89b-12d3-a456-426614174000"
}

DownloadUrl предоставляет прямую ссылку для загрузки очищенного файла со всеми удаленными метаданными. Файл будет доступен для загрузки в течение 24 часов.

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.

Ответы об ошибках

500Internal Server Error
{
  "success": false,
  "error": "An error occurred while processing your request"
}

Примеры кода

# 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)