APIドキュメント

シンプルで強力なAPIを使用してファイルからメタデータを抽出します。APIキーを取得して、プログラムでファイルの分析を開始しましょう。

認証

すべてのAPIリクエストにはAPIキーが必要です。2つの方法で提供できます:

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" はパスワードが必要などの理由で文書を読み取れなかったことを示します。

ファイルの url に ?view=1 を付けると、画像・動画・音声・PDF をダウンロードせずにブラウザで開けます。risky と表示されたファイル(プログラム、スクリプト、マクロ)は常にダウンロードになります。

エラーレスポンス

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

Content Credentials

Content Credentials(C2PA)付きのファイルには contentCredentials ブロックが含まれます。抽出時に公式の C2PA ツールを使い、オフラインで確認します。署名が有効か、署名後にファイルが変更されていないか、署名者が信頼済みリストに登録されているか、そして認証情報が何を申告しているか(AI 生成、操作、元になったファイル)を調べます。

レスポンス例

"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 はファイルがオンラインに保存された認証情報を参照していることを示します(当サイトでは取得しません)。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)