Hex to CMYK ink percentages
See the ink recipe and its total load in one go: #3498db needs cyan 76%, magenta 31%, yellow 0% and key 14%, a total of 121% coverage. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Hex
- #3498db
- Hex raw
- #3498db
- Hex6
- 3498db
- Resistance (Ω)
- 52
- G
- 152
A hex to CMYK ink percentages calculator takes a screen color written as a hexadecimal code—three or six digits, with or without a leading hash—and maps it into the four process-ink channel percentages that printers, packaging proofs, and press handoff sheets still speak: cyan, magenta, yellow, and key (black), each from zero through one hundred percent with integer rounding suited to print specs. Paste #3498db or the short form #abc; the tool expands shorthand when needed, normalizes to a lowercase six-digit hex, derives the red green and blue channels, then applies the standard subtractive RGB-to-CMYK formula used for quick ink-channel previews and design handoffs.
What hex and CMYK ink channels mean and how the conversion works
Hexadecimal color codes pack three eight-bit channels into a compact string that stylesheets, design tools, and brand guidelines have used for decades. In the six-digit form #RRGGBB, the first two characters encode red, the middle two encode green, and the last two encode blue, each pair interpreted as a base-sixteen integer from zero through two hundred fifty-five. The three-digit shorthand #RGB doubles each digit so #abc becomes #aabbcc—the same expansion CSS applies when you write short hex in a stylesheet.
CMYK ink channels are a subtractive model: cyan, magenta, and yellow remove light from white paper, while key (black) deepens shadows and saves ink on dark neutrals. Print specs and vendor briefs usually quote each channel as an integer percent from zero to one hundred so press operators and estimators can compare recipes at a glance.
This converter first expands and parses the hex into integer RGB channels, scales them to unit range by dividing by two hundred fifty-five, then computes K as one minus the maximum of those three unit channels. When K is effectively one, pure black is returned as zero cyan magenta yellow and one hundred percent key.
Otherwise each of C, M, and Y is (one minus the channel minus K) divided by (one minus K), multiplied by one hundred, and rounded to the nearest integer percent—the same closed form used for textbook device-independent print previews. Remember that this path is not an ICC press profile: different paper stocks, ink limits, and calibration will still shift appearance even when the channel percentages match this calculator.
Practical tips, limits, and related searches
Prefer sending the hex string your design tool exported, including the hash if you have it; both forms work, and the response always normalizes to lowercase six-digit hex so downstream diffs stay stable. Treat the CMYK ink channel values as a quick print-spec preview, not as a guarantee of press output: different paper, ink limits, and ICC profiles will shift appearance even when the percentages match this calculator.
Do not pass alpha forms such as #RRGGBBAA or #RGBA—this landing is intentionally limited to classic opaque RGB packing, and those lengths are rejected so you notice rather than silently dropping alpha. Named CSS colors like rebeccapurple are out of scope; resolve them to hex first or use a broader multi-space tool when you need HSL, LAB, or batch conversion.
Prefer this capability when you already have a hex token and only need CMYK ink channel percentages or a cmyk() string for a brief; if your pipeline starts from separate RGB integers, use the dedicated RGB-to-CMYK path instead.
What you can do with it
Brand hex to print-spec ink channels
Designers paste brand hex codes from Figma or a style guide and receive cyan, magenta, yellow, and key percentages for packaging mockups, print quotes, and handoff sheets.
Style-guide and vendor brief documentation
Convert web hex tokens into CMYK ink channel strings for PDF style guides, vendor briefs, and merchandising color chips without opening a desktop color studio.
FAQ
What hex formats does the hex to CMYK ink percentages tool accept?
Three-digit (#RGB) and six-digit (#RRGGBB) hexadecimal colors, with or without a leading #. Letters may be upper or lower case. Alpha forms and named CSS colors are not accepted.
How is three-digit shorthand expanded before ink channel conversion?
Each digit is doubled: #abc becomes #aabbcc, then each pair is parsed as a base-16 RGB channel from 0 to 255 and converted with the standard RGB-to-CMYK formula and integer percent rounding.
What do cyan, magenta, yellow, and key ink channels represent?
Process-ink intensities as integer percentages from 0 through 100.
Is the hex to CMYK ink percentages converter free?
The browser tool is free and runs locally.
What ink percentages does #3498db need?
Cyan 76%, magenta 31%, yellow 0% and key 14%, which add up to a total ink of 121%. Each channel is rounded to a whole percent, the way print specs usually quote it.
Related tools
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/hex-to-ink-channels \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"hex":"#3498db"}'const res = await fetch("https://api.kit.forhosting.com/color/hex-to-ink-channels", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"hex": "#3498db"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/color/hex-to-ink-channels",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"hex": "#3498db"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/color/hex-to-ink-channels", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"hex":"#3498db"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"hex":"#3498db"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/color/hex-to-ink-channels", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"hex": "#3498db"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "color.hex_to_ink_channels",
"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. |
Technical notes
Invalid codes—wrong length, non-hex characters, empty input, or a programming 0x prefix—fail with a clear invalid_input error instead of inventing ink loads.
What hex and CMYK ink channels mean and how the conversion works
The response also sums the four channels into total_ink so you can spot heavy coverage at a glance before a full TAC check on the RIP.
How to call the API and what comes back
Valid examples include #3498db, 3498db, #ABC, and abc; surrounding whitespace is trimmed, letters may be upper or lower case, and the hash is optional. When you wire this into a pipeline, treat the integer channel fields as the stable contract and treat message and steps as human-facing diagnostics you may ignore in machine checks. Send a JSON body with one required string field named hex—aliases color, value, text, input, and code are accepted by the same solver. On success the response returns hex as a normalized lowercase #rrggbb string, hex6 without the hash, integer RGB fields r g b plus red green blue aliases and an rgb array, a css rgb() string, integer cyan magenta yellow and key percentages with black and c m y k aliases, an ink_channels object with the four named channels, a cmyk array of four numbers, total_ink as the sum of those four percentages, ink_css and cmyk_css strings of the form cmyk(C%, M%, Y%, K%), booleans shorthand and had_hash describing the original form, a short English message, and a steps array that shows each parse and conversion line for debugging or teaching. Failed validation—missing field, empty string after the hash, length other than three or six, non-hex characters, spaces inside the body, a 0x programming prefix, or a bare number instead of a string—returns invalid_input and is never charged. Pricing is a flat $0.002 per successful request with unit item.
Practical tips, limits, and related searches
Use total_ink as a first filter when a brand palette looks muddy on proof—very high sums often need under-color removal or black generation on the RIP rather than a different hex. Failed tasks that return invalid_input do not consume prepaid balance, which keeps exploratory scripts and form validation cheap while learners paste imperfect clipboard values.
Integration use cases
Unit tests for palette and print fixtures
Generate known-good CMYK ink channel tuples from hex fixtures so visual regression and print-preview tests assert stable integer ink values.
Technical questions
What happens on an invalid hex code?
The API returns invalid_input with a message describing the problem (empty input, wrong length, non-hex characters, 0x prefix, and so on). Failed validation is not charged.