Check image copyright metadata and creator fields
This image copyright metadata checker reviews an extracted IPTC or XMP metadata block and tells you whether both copyright and creator information are populated.
Run — free
Runs in your browser. Free, unlimited — your data never leaves this page.
It recognizes common field spellings, qualified XMP names, and nested metadata objects without reading or changing the image itself. The result identifies which field paths matched and which required category is missing, making it suitable for a quick manual review or a repeatable publishing check before delivery.
Check the metadata before an image is published
Copyright information is useful only when it travels with the asset and can be found by the systems that catalog, license, or publish it. This checker gives you a focused preflight test for two fundamental categories: a copyright or rights statement and a creator attribution. Supply the metadata block already extracted from the image, and the result reports whether each category has at least one populated value. It also lists the exact paths that matched, so a reviewer can see whether the evidence came from a flat IPTC property, a qualified XMP key, or a nested object. The check is intentionally narrow. It does not claim that a statement is legally sufficient, verify that the named creator owns the work, or determine licensing terms. Instead, it answers a practical production question consistently: did the exported metadata retain usable copyright and creator fields? That makes it easy to place before upload, delivery, syndication, or archival steps where missing attribution would otherwise be noticed too late.
How common IPTC and XMP names are interpreted
Metadata libraries expose the same concepts in different shapes. One extractor may return keys such as CopyrightNotice and By-line, another may return dc:rights and dc:creator, and a third may group properties below iptc, xmp, dc, or photoshop objects. The checker normalizes capitalization and punctuation while preserving the original matched path in its output. A string counts as populated only when it contains non-whitespace text. An array counts when at least one member is populated, which accommodates XMP creator sequences and rights alternatives. Nested objects are inspected recursively in a deterministic key order. Numbers, booleans, empty strings, empty arrays, and objects without textual values do not satisfy either requirement. Some credit-related fields are recognized because real export tools use them for attribution, but the output remains transparent: matched_fields shows exactly what caused a positive result. If your organization requires a smaller approved field set, use those paths in a separate policy check rather than treating this presence test as a full metadata conformance profile.
Understand missing blocks, missing values, and the result
There is an important difference between metadata that was not supplied and metadata that was supplied but lacks the requested fields. If the metadata block is absent or null, the request fails with an invalid input error because there is nothing to inspect. An explicitly supplied empty object is valid input and produces a normal result with both categories listed in missing_fields. That distinction helps automation separate an extraction or integration failure from an image that genuinely contains no attribution fields. The valid flag is true only when both copyright_present and creator_present are true. Each boolean can still be used independently when your workflow permits one category to be repaired later. The checker does not fetch an image, parse binary JPEG or TIFF segments, write tags, contact a registry, or retain the submitted object. Extract metadata with your preferred imaging tool first, then send the resulting object here. At $0.002 per API request, it can serve as a small deterministic gate in asset ingestion, export validation, or content delivery pipelines.
What you can do with it
Preflight a publishing export
Confirm that an exported asset still carries creator attribution and a copyright or rights statement before upload.
Validate a digital asset migration
Compare extracted metadata after migration and flag records whose attribution fields were dropped or emptied.
Gate a contributor intake workflow
Return incomplete submissions for correction when either creator information or copyright information is absent.
FAQ
Does this tool read the image file itself?
No. It checks an IPTC/XMP metadata object that you have already extracted from the image.
What happens when the metadata block is missing?
The request returns an invalid input error because the capability has no metadata to inspect.
Does an empty metadata object cause an error?
No. An empty object is inspected normally and reports both copyright and creator as missing.
Are arrays such as dc:creator supported?
Yes. An array is populated when at least one of its entries contains non-whitespace text.
Does a positive result prove ownership or license validity?
No. It confirms field presence only; it does not authenticate authorship, ownership, permission, or legal sufficiency.
What does the API check cost?
Each API request costs $0.002. The browser version can run locally without sending the metadata to the API.
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/image/metadata-copyright-embed-check \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"metadata":{"dc:creator":["Avery Stone"],"dc:rights":"Copyright 2026 Avery Stone"}}'const res = await fetch("https://api.kit.forhosting.com/image/metadata-copyright-embed-check", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"metadata": {
"dc:creator": [
"Avery Stone"
],
"dc:rights": "Copyright 2026 Avery Stone"
}
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/image/metadata-copyright-embed-check",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"metadata": {
"dc:creator": [
"Avery Stone"
],
"dc:rights": "Copyright 2026 Avery Stone"
}
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/image/metadata-copyright-embed-check", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"metadata":{"dc:creator":["Avery Stone"],"dc:rights":"Copyright 2026 Avery Stone"}}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"metadata":{"dc:creator":["Avery Stone"],"dc:rights":"Copyright 2026 Avery Stone"}}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/image/metadata-copyright-embed-check", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"metadata": {
"dc:creator": [
"Avery Stone"
],
"dc:rights": "Copyright 2026 Avery Stone"
}
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "image.metadata_copyright_embed_check",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Limits
max_mb | 15 |
max_megapixels | 12 |
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |