Check PDF embedded color profile
This PDF color profile checker reads an extracted XMP, RDF, or PDF metadata dictionary and reports whether it explicitly declares a CMYK profile, an RGB profile, or no embedded color profile.
Run — free
That distinction is useful before commercial printing because an RGB declaration may signal that conversion is still required, while a named CMYK output profile can document the intended press condition. The check is deterministic, runs without uploading a PDF to another service, and explains which metadata clue produced the classification.
What the checker establishes
A PDF can look correct on a monitor while still carrying color information that is unsuitable or ambiguous for a print workflow. This checker focuses on one narrow, auditable question: does the supplied metadata block explicitly identify a CMYK profile, identify an RGB profile, or contain no recognized profile declaration? It searches canonical color-space terms, common ICC profile families, and Photoshop color-mode values that appear in XMP and related metadata. The result includes the classification, a Boolean indicating whether a profile was found, and concise evidence describing the matched declaration. A complete metadata block with no relevant declaration returns none; that is a valid result, not an error. By contrast, text that is not a complete XMP, RDF, or serialized PDF dictionary is rejected because silently treating missing metadata as an unprofiled document would hide an extraction failure. The tool analyzes metadata only. It does not render pages, inspect every image object, open an OutputIntent stream, or prove that all page elements use the declared space.
How to prepare and interpret metadata
Supply the complete metadata block extracted from the PDF, including its XMP or RDF wrapper, or provide a complete PDF dictionary enclosed by double angle brackets. Preserve profile names and color-space fields exactly; they carry the evidence used for classification. A CMYK result can come from declarations such as DeviceCMYK, a CMYK color-model value, Photoshop color mode 4, or a recognizable press-profile family such as FOGRA, SWOP, GRACoL, or an ISO Coated profile. An RGB result can come from DeviceRGB, CalRGB, sRGB, Adobe RGB, Display P3, ProPhoto RGB, ECI RGB, an RGB model value, or Photoshop color mode 3. If both families are explicitly present, the checker rejects the input as conflicting rather than choosing whichever match happens to appear first. Interpret none literally: no supported embedded profile declaration was found in the supplied block. It does not mean that the PDF contains no color, nor does it guarantee device-independent output. It means the available metadata does not declare a profile the checker can classify.
Using the result in a print-readiness review
Treat this result as an early checkpoint, not as a complete preflight certificate. For offset or digital print production, a declared CMYK profile is often a useful sign because it records a press-oriented color condition, but the correct profile still depends on the printer, paper, ink limits, and regional standard. An RGB result is not automatically defective: modern PDF workflows may preserve RGB content and convert it through a controlled output intent at the raster image processor. It does, however, tell the production team to confirm where and how conversion will occur. A none result deserves a documented decision. The file may rely on device color, a separate job ticket, or output intent data that was not included in the extracted metadata. Combine this check with page-size, bleed, font embedding, image resolution, transparency, overprint, spot-color, and OutputIntent inspection. In automated intake, store the classification and evidence beside the job, route RGB or unprofiled files for review, and reserve hard rejection for rules agreed with the print provider. Via the API, each metadata check costs $0.002.
What you can do with it
Screen incoming print files
Route PDFs with RGB or absent profile declarations to a prepress review before production begins.
Document supplier compliance
Record the declared color family and matching evidence alongside each submitted advertising or packaging file.
Debug inconsistent output
Compare metadata declarations across PDF revisions when proofs and final prints show unexpected color shifts.
FAQ
Does a CMYK result guarantee that the PDF is print-ready?
No. It confirms a CMYK declaration in the supplied metadata, but a full preflight must also inspect page objects, output intents, fonts, bleed, resolution, and other production requirements.
Why does a valid metadata block return none?
The block is structurally present but contains no supported CMYK or RGB profile declaration. This differs from a missing block, which is rejected as invalid input.
Is an RGB profile always wrong for printing?
No. Some managed workflows intentionally keep RGB data until output conversion. Confirm the conversion policy and target press condition with the print provider.
What happens if CMYK and RGB declarations both appear?
The input is rejected as conflicting because selecting one declaration would conceal ambiguity that should be resolved during preflight.
Does the checker read the complete PDF file?
No. It accepts an extracted XMP, RDF, or PDF metadata dictionary. It does not parse page content or decode embedded ICC streams from PDF bytes.
What does an API check cost?
Each request costs $0.002. The work is deterministic and does not call external services.
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/pdf/color-profile-check \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"metadata":"<x:xmpmeta xmlns:x=\"adobe:ns:meta/\"><rdf:RDF><rdf:Description photoshop:ICCProfile=\"U.S. Web Coated (SWOP) v2\" photoshop:ColorMode=\"4\"/></rdf:RDF></x:xmpmeta>"}'const res = await fetch("https://api.kit.forhosting.com/pdf/color-profile-check", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"metadata": "<x:xmpmeta xmlns:x=\"adobe:ns:meta/\"><rdf:RDF><rdf:Description photoshop:ICCProfile=\"U.S. Web Coated (SWOP) v2\" photoshop:ColorMode=\"4\"/></rdf:RDF></x:xmpmeta>"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/pdf/color-profile-check",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"metadata": "<x:xmpmeta xmlns:x=\"adobe:ns:meta/\"><rdf:RDF><rdf:Description photoshop:ICCProfile=\"U.S. Web Coated (SWOP) v2\" photoshop:ColorMode=\"4\"/></rdf:RDF></x:xmpmeta>"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/pdf/color-profile-check", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"metadata":"<x:xmpmeta xmlns:x=\\"adobe:ns:meta/\\"><rdf:RDF><rdf:Description photoshop:ICCProfile=\\"U.S. Web Coated (SWOP) v2\\" photoshop:ColorMode=\\"4\\"/></rdf:RDF></x:xmpmeta>"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"metadata":"<x:xmpmeta xmlns:x=\"adobe:ns:meta/\"><rdf:RDF><rdf:Description photoshop:ICCProfile=\"U.S. Web Coated (SWOP) v2\" photoshop:ColorMode=\"4\"/></rdf:RDF></x:xmpmeta>"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/pdf/color-profile-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": "<x:xmpmeta xmlns:x=\"adobe:ns:meta/\"><rdf:RDF><rdf:Description photoshop:ICCProfile=\"U.S. Web Coated (SWOP) v2\" photoshop:ColorMode=\"4\"/></rdf:RDF></x:xmpmeta>"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "pdf.color_profile_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_chars | 250000 |
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. |