Recommend a barcode symbology for your use case
Choosing a barcode is not mainly a question of which pattern looks best. The right symbology depends on who will scan it, which identifier it must carry, and which industry standard governs the workflow.
Run — free
This deterministic barcode symbology recommender maps four common use cases—retail products, shipping labels, inventory tracking, and library books—to the standard one-dimensional barcode normally used. It also explains the identifier and standard behind the choice, so you can distinguish an industry convention from a merely scannable alternative.
Start with the scanning ecosystem, not the artwork
A barcode symbology defines how characters are represented by bars and spaces, but successful deployment depends on more than technical encodability. A retail checkout expects identifiers managed under GS1 rules, while a private warehouse may only need a compact internal asset code. Begin by identifying who assigns the data, where the symbol will be scanned, and whether another organization must understand it without a private agreement. For a retail product, EAN-13 is the typical global recommendation because it carries a GTIN-13 and is recognized throughout point-of-sale infrastructure. In markets centered on twelve-digit GTINs, UPC-A remains common and is compatible with the same GS1 identification system. The recommendation therefore names the usual standard rather than claiming that every country, partner, or scanner has identical requirements. Confirm the data owner and trading-partner specification before printing a production run. A symbol that scans perfectly can still be operationally wrong if it contains an unapproved identifier, has unsuitable dimensions, or appears in the wrong place on the package.
Separate the data structure from the barcode carrier
The identifier and its printed carrier are related, but they are not the same thing. Code 128 is a general symbology capable of encoding a wide character set efficiently. GS1-128 uses that carrier under additional GS1 rules, including a leading function character and Application Identifiers that define the meaning and length of data elements. That distinction is why the recommender chooses GS1-128 for a shipping label but plain Code 128 for ordinary internal inventory tracking. A logistics label may need a Serial Shipping Container Code, a date, a batch number, or another structured field that receiving systems can interpret consistently. An internal stockroom label often needs only an organization-defined SKU or asset identifier, making Code 128 simpler and broadly compatible. Do not add GS1 syntax merely because a printer offers a GS1-128 option: GS1 identifiers must be allocated and formatted correctly. Conversely, do not use an unstructured Code 128 string when a carrier, retailer, or customer specification requires GS1 data. The workflow determines both the carrier and the rules governing its contents.
Treat the result as a standards-based starting point
The output gives the convention typically associated with the selected use case, together with the standard, encoded identifier, and reason. For a library book, it recommends EAN-13 carrying an ISBN-13, commonly described as a Bookland EAN. That choice serves identification of a published edition; a library may still add a separate patron-independent item barcode for its own circulation system. Similar qualifications apply elsewhere. Inventory programs may be required to use GS1 identifiers, defense standards, or a two-dimensional symbol because of customer rules or space constraints. Shipping providers may mandate a specific label specification with several symbols rather than one generic barcode. Retail packaging must meet print quality, quiet-zone, magnification, color, and placement requirements in addition to selecting a symbology. Use this result to choose the normal standards family and to frame questions for your scanner vendor, print provider, trading partner, or standards body. Before deployment, verify the exact data format and label dimensions, test with the scanners used in the real environment, and obtain any identifiers from the organization authorized to issue them.
What you can do with it
Plan retail packaging
Identify the usual GS1 barcode carrier before assigning artwork space or requesting a GTIN for a consumer product.
Design operational labels
Distinguish structured GS1 logistics data from a private Code 128 identifier used only inside an inventory system.
Label a library collection
Confirm the conventional carrier for an ISBN-13 while recognizing that a separate circulation item barcode may also be needed.
FAQ
What does the recommendation cost?
Each API request costs $0.002; the same deterministic lookup can also run in the browser.
Why is EAN-13 recommended for a retail product?
EAN-13 is the usual point-of-sale carrier for a GS1 GTIN-13 and is supported by retail scanning systems worldwide. UPC-A is common for GTIN-12 identifiers in UPC-focused markets.
What is the difference between Code 128 and GS1-128?
Code 128 is the barcode symbology. GS1-128 applies GS1 formatting rules and Application Identifiers so trading partners can interpret structured fields consistently.
Does a library book need only its ISBN barcode?
Not always. The ISBN-13 identifies the published edition, while a library may attach another barcode that identifies its individual circulating copy.
Can this replace a carrier or retailer label specification?
No. It provides the typical symbology for a broad use case. A trading partner may require exact identifiers, dimensions, placement, print quality, or additional symbols.
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/doc/barcode-symbology-recommend \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"use_case":"retail_product"}'const res = await fetch("https://api.kit.forhosting.com/doc/barcode-symbology-recommend", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"use_case": "retail_product"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/doc/barcode-symbology-recommend",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"use_case": "retail_product"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/doc/barcode-symbology-recommend", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"use_case":"retail_product"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"use_case":"retail_product"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/doc/barcode-symbology-recommend", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"use_case": "retail_product"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "doc.barcode_symbology_recommend",
"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_mb | 25 |
max_pages | 200 |
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. |