Estimate the nearest Pantone-style color family from RGB
This RGB color classifier estimates the nearest broad Pantone-style hue family and describes its tone without pretending to identify an exact proprietary swatch.
Run — free
Enter red, green, and blue channel values from 0 to 255. The result gives a readable family such as blue, teal, magenta, or warm neutral, plus a qualifier such as deep, pale, muted, or vivid. It is useful for organizing colors, writing accessible descriptions, and creating a consistent first-pass vocabulary across design and catalog workflows.
What this estimate means
A screen color and a printed spot color are not interchangeable measurements. RGB describes emitted light on a display, while a printed color depends on ink, substrate, coating, lighting, and a controlled production process. This tool therefore answers a deliberately broader question: which familiar Pantone-style hue family and tonal character best describe the supplied RGB value? It does not return a catalog number, claim a licensed lookup, or promise that a press sheet will match a monitor. The family label is intended for useful communication: red, orange, yellow, yellow-green, green, teal, cyan, blue, violet, magenta, warm neutral, or cool neutral. The tone adds practical nuance, distinguishing results such as pale blue, rich violet, or dark muted warm neutral. Treat the output as an estimate for tagging, search, copywriting, early design discussion, or palette organization. For production printing, compare a physical, current color guide under controlled light and consult the printer responsible for the job.
How the classification is calculated
The calculation is deterministic and runs without a network request or model inference. It first validates that all three channels are integers between 0 and 255. The sRGB values are linearized, transformed through the standard D65 RGB-to-XYZ matrix, and then converted to CIELAB coordinates. CIELAB is useful here because straight-line distances in that space are more closely related to perceived color differences than distances between raw red, green, and blue numbers. The sample is compared with a small, disclosed set of general-purpose hue anchors, and the nearest anchor supplies the family name. Very low-chroma samples receive a warm-neutral or cool-neutral label so that a nearly gray color is not misleadingly called blue or red. Tone is derived separately from CIELAB lightness and chroma thresholds. The returned distance is an algorithmic comparison to the selected general anchor, not a quality score and not a delta to any proprietary swatch library. Identical input always produces identical output.
Using the result responsibly
Use the family and tone together rather than focusing on the numeric distance alone. A label such as “soft teal” is usually more useful to a merchandiser, content editor, or design-system maintainer than a claim of false catalog precision. The reference RGB in the response exposes the anchor used by the algorithm, making classifications easier to audit and reproduce. Nearby colors may cross a family or tone boundary because every classifier must divide a continuous color space into named regions; that boundary does not imply a sudden visual difference. Display calibration, ambient light, color profiles, and human vision can also change how the original RGB appears. If brand compliance, packaging approval, textile dyeing, or press output depends on an official match, use this result only to narrow the conversation and then verify against authorized physical references and production proofs. The API costs $0.002 per item when automated, while the browser execution uses the same pure calculation so exploratory checks remain consistent with automated results.
What you can do with it
Tag a digital asset library
Add consistent broad hue and tone labels to RGB-based images, icons, or product records.
Describe a palette clearly
Turn channel values into readable phrases that colleagues can discuss without claiming exact spot-color equivalence.
Shortlist print references
Use a general family estimate to narrow an initial search before checking authorized physical guides and proofs.
FAQ
Does this return an exact Pantone color number?
No. It returns a broad Pantone-style family and tone using non-proprietary anchors, not a licensed catalog match.
What RGB values are accepted?
Provide r, g, and b as integers from 0 through 255. Missing, fractional, or out-of-range channels are rejected.
How is the nearest family chosen?
The RGB value is converted to CIELAB and compared by distance with a fixed set of general hue anchors.
Why can a nearly gray color be warm neutral or cool neutral?
Low-chroma colors have little usable hue, so their subtle CIELAB bias determines the more informative neutral family.
Can I use this for final print approval?
No. Final approval should use authorized physical references, controlled lighting, the intended material, and a production proof.
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/color/pantone-nearest-estimate \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"r":30,"g":90,"b":160}'const res = await fetch("https://api.kit.forhosting.com/color/pantone-nearest-estimate", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"r": 30,
"g": 90,
"b": 160
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/color/pantone-nearest-estimate",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"r": 30,
"g": 90,
"b": 160
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/color/pantone-nearest-estimate", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"r":30,"g":90,"b":160}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"r":30,"g":90,"b":160}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/color/pantone-nearest-estimate", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"r": 30,
"g": 90,
"b": 160
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "color.pantone_nearest_estimate",
"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.
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. |