Brand palette usage ratio checker
A brand palette is more than a list of approved colors: it also needs a practical balance.
Run — free
This checker converts measured pixel-area coverage into percentages, then compares every color with the share assigned by your guideline. Enter coverage in pixels or any other consistent area unit, add target percentages such as 60, 30, and 10, and choose an acceptable tolerance. The result shows which colors comply, exactly how far each one differs, and whether the design matches the guideline as a whole.
Turn pixel coverage into a meaningful palette audit
A visual may use every approved swatch and still feel unlike the brand because the proportions are wrong. A large accent field can overpower the primary color, while an oversized neutral area can make a campaign look muted. Start with pixel-area measurements from the complete design or from a clearly defined region. Add one row for each brand color and keep the coverage unit consistent across all rows. Raw pixel counts work well, but square points, sampled cells, or another shared area unit produce the same percentages. The checker adds those values and divides each color by the positive total, so image dimensions and measurement scale do not affect the ratio. Name colors by role or code in a way reviewers recognize, such as Primary Blue, Background Cream, or #F05A28. Include every area that belongs in the palette decision; omitting a large background or combining unrelated colors can make a mathematically correct result describe the wrong design. Transparent regions and photographs should be excluded unless your brand guideline explicitly treats them as palette coverage.
Set targets and interpret percentage-point deviations
Enter a target percentage for every listed color. The targets must total 100 because they describe the whole measured brand-color area. A classic hierarchy is 60 percent dominant, 30 percent secondary, and 10 percent accent, but the calculator does not assume that rule; it supports any complete allocation across two to twenty colors. The reported deviation is measured in percentage points, not as a relative percent change. If a color occupies 14 percent against a 10 percent target, its deviation is positive 4 percentage points. If it occupies 27.5 percent against a 30 percent target, the deviation is negative 2.5 points. Positive means overused and negative means underused. The tolerance controls when those differences are considered acceptable. With a tolerance of 2, deviations from negative 2 through positive 2 pass. Each row receives its own pass result, and the overall guideline matches only when every row passes. This makes the final decision transparent instead of hiding several color differences inside one average score.
Use the result in design review and quality control
Treat the numbers as evidence for a visual review, not as a replacement for one. Begin with the overall match, then inspect the individual deviations to decide where an adjustment will have the greatest effect. When an accent is over target, reducing that color or increasing other included areas can restore balance; percentages are linked because they share one total. Preserve the coverage data, target allocation, tolerance, and result beside the design version so another reviewer can reproduce the decision. For automated quality control, use the API response to flag assets that fail and route them to a designer rather than rejecting them silently. Apply the same measurement method to every asset in a campaign, since anti-aliasing, color similarity thresholds, gradients, and image cropping can change pixel counts before this checker receives them. The calculation itself is deterministic and performs no image analysis: it evaluates the coverage values you provide. That separation is useful because teams can choose their own extraction method while keeping the ratio decision consistent, auditable, and easy to repeat across web pages, advertisements, presentations, and templates.
What you can do with it
Review a 60-30-10 composition
Confirm that dominant, secondary, and accent colors stay within the agreed tolerance for a finished layout.
Audit campaign consistency
Compare measured palette proportions across banners, social graphics, and landing pages using one reproducible rule.
Add a design QA gate
Flag exported assets when any brand color differs from its target by more than the permitted percentage points.
FAQ
What coverage unit should I use?
Use pixels or any other non-negative area unit, provided every color uses the same unit. Percentages depend only on the proportions.
Must target percentages add up to 100?
Yes. The targets represent a complete allocation of the measured brand-color area, so their sum must be 100.
What does the tolerance mean?
It is the maximum absolute deviation in percentage points allowed for each color. Every color must pass for the overall guideline to match.
Does this tool extract colors from an image?
No. It evaluates coverage measurements you already have; it does not upload, inspect, or classify an image.
What happens if all coverage values are zero?
The request returns an invalid-input error because percentages cannot be calculated from a total that is not positive.
What does an API request cost?
Each API request costs $0.002. The browser version can perform the same deterministic calculation locally.
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/date/brand-color-usage-ratio-check \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"colors":[{"color":"Primary blue","coverage":60000,"target_percentage":60},{"color":"Secondary gray","coverage":30000,"target_percentage":30},{"color":"Accent orange","coverage":10000,"target_percentage":10}]}'const res = await fetch("https://api.kit.forhosting.com/date/brand-color-usage-ratio-check", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"colors": [
{
"color": "Primary blue",
"coverage": 60000,
"target_percentage": 60
},
{
"color": "Secondary gray",
"coverage": 30000,
"target_percentage": 30
},
{
"color": "Accent orange",
"coverage": 10000,
"target_percentage": 10
}
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/date/brand-color-usage-ratio-check",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"colors": [
{
"color": "Primary blue",
"coverage": 60000,
"target_percentage": 60
},
{
"color": "Secondary gray",
"coverage": 30000,
"target_percentage": 30
},
{
"color": "Accent orange",
"coverage": 10000,
"target_percentage": 10
}
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/date/brand-color-usage-ratio-check", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"colors":[{"color":"Primary blue","coverage":60000,"target_percentage":60},{"color":"Secondary gray","coverage":30000,"target_percentage":30},{"color":"Accent orange","coverage":10000,"target_percentage":10}]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"colors":[{"color":"Primary blue","coverage":60000,"target_percentage":60},{"color":"Secondary gray","coverage":30000,"target_percentage":30},{"color":"Accent orange","coverage":10000,"target_percentage":10}]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/date/brand-color-usage-ratio-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
{
"colors": [
{
"color": "Primary blue",
"coverage": 60000,
"target_percentage": 60
},
{
"color": "Secondary gray",
"coverage": 30000,
"target_percentage": 30
},
{
"color": "Accent orange",
"coverage": 10000,
"target_percentage": 10
}
]
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "date.brand_color_usage_ratio_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.
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. |