Cross stitch floss estimator
The cross stitch floss estimator turns a pattern's stitch totals into a practical shopping list.
Run — free
Enter each floss color and its stitch count, specify how many stitches one skein is expected to cover, and add an allowance for starts, finishes, carrying, mistakes, and small leftovers. The calculator rounds every color up to a whole skein and returns both the per-color quantities and the project total. It is useful when a chart lists stitch counts but does not provide reliable purchasing quantities for your fabric count, strand choice, or stitching habits.
Start with a reliable stitch count for every color
Create one row for each distinct floss color in the design, using the chart's color name or number and the total number of stitches assigned to it. Many digital pattern tools provide these counts directly. For a paper chart, a pattern inventory or the designer's key may be the easiest source. Combine repeated appearances of the same color into one row because the estimator treats every row as a separate quantity that must be rounded up. Backstitch, French knots, specialty stitches, blending filaments, beads, and other materials do not convert cleanly into ordinary full-cross-stitch coverage, so include them only if you have already converted their consumption into an equivalent full-stitch count. Check that similar-looking color labels are not accidental duplicates. The calculator deliberately rejects duplicate labels because two partial calculations for one color could each round upward and exaggerate the shopping total. Good inputs are especially important for colors used in only a few stitches: even a tiny positive requirement still means obtaining that color unless it is already in your stash.
Choose coverage that matches fabric and strand use
Coverage per skein is the estimated number of complete cross stitches you can make from one skein. It is not universal. A skein used with two strands on a moderate fabric count covers a different number of stitches than the same skein used with three strands, long tails, large carries, railroading, or a different stitch size. Use a value supplied by a trusted pattern source when its assumptions match your project. Otherwise, base the figure on a measured sample: record the floss length consumed by a known number of stitches and compare that consumption with the usable length in a skein. Keep all color rows under the same coverage assumption; if a particular color uses a different strand count or technique, estimate that group separately. The algorithm multiplies each color's stitch count by the allowance factor, rounds that adjusted count upward to a whole stitch for transparent reporting, divides by coverage, and then rounds upward to a whole skein. Because skeins are purchased as whole items, fractional purchasing results would be misleading.
Apply allowance and interpret the shopping list
The allowance percentage provides a buffer for floss that never becomes a visible stitch. Starting and ending tails, travel between areas, knots or loop starts, corrections, damaged sections, tension variation, and unusable short remnants all consume material. Ten percent is a practical default, but it is not a guarantee. A compact design with efficient routes may need less; scattered confetti, frequent color changes, generous tails, or an unfamiliar technique may justify more. The allowance is applied separately to every color before skeins are rounded up. That reflects purchasing reality: spare red floss cannot replace missing blue floss. Review the per-color results rather than relying only on the grand total, and compare them with floss already in your organizer before buying. The total is the sum of those whole-color requirements, not a pooled division of all stitches. Dye lots can vary, so consider purchasing all required skeins of a prominent color together. The estimate supports planning and budgeting, while actual consumption still depends on the stitcher's technique and the pattern's distribution.
What you can do with it
Build a pattern shopping list
Convert the color totals exported by pattern software into whole skein quantities before visiting a craft shop.
Check a kit's supplied floss
Compare the estimated requirement for each color with the quantities included in a kit, using coverage assumptions that match the instructions.
Budget a large design
Estimate the total number of skeins while retaining the per-color breakdown needed to price or stage purchases.
FAQ
What does the estimator cost?
The API price is $0.002 per request, and the browser version can run locally on this page.
Why are skeins rounded for each color instead of after adding all stitches?
Floss colors are not interchangeable. Each color must independently have enough material, so every per-color requirement is rounded up before the total is calculated.
What should I use for stitches per skein?
Use a coverage figure that matches the floss length, fabric count, number of strands, stitch type, and your technique. A measured sample is preferable when precision matters.
Does the allowance guarantee I will not run out?
No. It is a planning buffer, not a guarantee. Scattered stitches, long carries, mistakes, tension, and tail length can change actual consumption.
Can I enter the same color more than once?
No. Combine all stitches for a color into one row. This avoids rounding two partial requirements upward separately and overstating the result.
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/hobby/craft-crossstitch-floss \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"colors":[{"color":"DMC 310","stitch_count":2450},{"color":"DMC 666","stitch_count":980}],"stitches_per_skein":1800}'const res = await fetch("https://api.kit.forhosting.com/hobby/craft-crossstitch-floss", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"colors": [
{
"color": "DMC 310",
"stitch_count": 2450
},
{
"color": "DMC 666",
"stitch_count": 980
}
],
"stitches_per_skein": 1800
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/hobby/craft-crossstitch-floss",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"colors": [
{
"color": "DMC 310",
"stitch_count": 2450
},
{
"color": "DMC 666",
"stitch_count": 980
}
],
"stitches_per_skein": 1800
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/hobby/craft-crossstitch-floss", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"colors":[{"color":"DMC 310","stitch_count":2450},{"color":"DMC 666","stitch_count":980}],"stitches_per_skein":1800}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"colors":[{"color":"DMC 310","stitch_count":2450},{"color":"DMC 666","stitch_count":980}],"stitches_per_skein":1800}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/hobby/craft-crossstitch-floss", 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": "DMC 310",
"stitch_count": 2450
},
{
"color": "DMC 666",
"stitch_count": 980
}
],
"stitches_per_skein": 1800
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "hobby.craft_crossstitch_floss",
"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_colors | 500 |
max_stitches_per_color | 1000000000 |
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. |