Paul Tol discrete palettes
Pick a Paul Tol family and a count: bright with 3 colors returns #4477AA, #EE6677 and #228833. The colors come from fixed tables, so the same request always gives the same set, with nothing random. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Palette
- Bright
- N
- 3
- Colors
- #4477AA, #EE6677, #228833
Return discrete Paul Tol color schemes from fixed tables. Search intent: Paul Tol palette. No network calls or random seeds are required. Failed jobs are not billed.
What a discrete Paul Tol palette gives you
A discrete palette is a fixed list of clearly different colors meant to label separate groups: one color for each series, category or region. This tool returns four Paul Tol families, bright, vibrant, muted and light, exactly as they are stored in fixed tables. You choose the family and how many colors you need, and the colors come back in their table order. With bright and a count of 3, for example, you get #4477AA, #EE6677 and #228833. Nothing is generated or adjusted on the fly, so the result is the same today, tomorrow and on any other device.
Choosing a family and avoiding common mistakes
Start by counting the groups you need to tell apart, then request that many colors. If you ask for more than the family holds, the count is capped at the palette size, so check how many colors actually came back before assigning them. Keep one family per chart, because mixing colors from bright and muted in the same figure breaks the consistency of a single table. Use a discrete palette for categories, not for a continuous measurement such as temperature across a map, where a smooth color scale fits better. Finally, copy the hex codes exactly as returned, since even a small edit changes the color.
When to use it
Use when search intent matches. Return discrete Paul Tol color schemes from fixed tables. English-only delivery; Nitro hydrates other locales.
No network calls or random seeds are required. Failed jobs are not billed. No network calls or random seeds are required.
Failed jobs are not billed.
What you can do with it
Teaching
Pinned goldens.
FAQ
Which Paul Tol palettes can I choose?
Four discrete families are available: bright, vibrant, muted and light. Each one is a fixed table of colors, and you decide how many of its colors you want returned.
What happens if I ask for more colors than a palette has?
The count is capped by the size of the palette. You receive every color the family contains and no invented extras, so the set stays faithful to the original table.
Will I get the same colors every time?
Yes. The colors are read from fixed tables, with no random choice and no online lookup, so bright with 3 colors always returns #4477AA, #EE6677 and #228833.
What does a discrete palette mean?
A discrete palette is a short list of separate colors rather than a smooth gradient. You use one color per category, such as one per line or bar in a chart, instead of shading a continuous value.
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/tol-palette \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"palette":"bright"}'const res = await fetch("https://api.kit.forhosting.com/color/tol-palette", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"palette": "bright"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/color/tol-palette",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"palette": "bright"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/color/tol-palette", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"palette":"bright"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"palette":"bright"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/color/tol-palette", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"palette": "bright"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "color.tol_palette",
"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
The calculator is free in the browser, deterministic, and identical on the API path. Inputs are validated before arithmetic so invalid payloads fail with invalid_input. Half-up rounding is applied once from raw IEEE values when decimals are requested.
How it works
No network calls or random seeds are required. Failed jobs are not billed. No network calls or random seeds are required. Failed jobs are not billed. Half-up rounding Return discrete Paul Tol color schemes from fixed tables. bright/vibrant/muted/light palettes. The calculator is free in the browser, deterministic, and identical on the API path. Inputs are validated before arithmetic so invalid payloads fail with invalid_input. Half-up rounding is applied once from raw IEEE values when decimals are requested. The calculator is free in the browser, deterministic, and identical on the API path. Inputs are validated before arithmetic so invalid payloads fail with invalid_input. Half-up rounding is applied once from raw IEEE values when decimals are requested. The calculator is free in the browser, deterministic, and identical on the API path. Inputs are validated before arithmetic so invalid payloads fail with invalid_input.
Inputs, limits and rounding
Optional decimals use half-up once. Optional output fields are omitted, never null. No network calls or random seeds are required. Failed jobs are not billed. No network calls or random seeds are required. Failed jobs are not billed. Provide required JSON fields with DOM-safe names. Invalid types raise invalid_input. The calculator is free in the browser, deterministic, and identical on the API path. Inputs are validated before arithmetic so invalid payloads fail with invalid_input. Half-up rounding is applied once from raw IEEE values when decimals are requested. The calculator is free in the browser, deterministic, and identical on the API path. Inputs are validated before arithmetic so invalid payloads fail with invalid_input. Half-up rounding is applied once from raw IEEE values when decimals are requested.
When to use it
The calculator is free in the browser, deterministic, and identical on the API path. Inputs are validated before arithmetic so invalid payloads fail with invalid_input. Half-up rounding is applied once from raw IEEE values when decimals are requested. The calculator is free in the browser, deterministic, and identical on the API path. Inputs are validated before arithmetic so invalid payloads fail with invalid_input. Half-up rounding is applied once from raw IEEE values when decimals are requested.
Integration use cases
Quick check
Free widget.
Automation
API same JSON.
Technical questions
Free?
Yes tier A.
Network?
No.
Bad input?
invalid_input.
API?
Yes.
Locales?
EN-only; Nitro hydrates.