Base58 encoder & decoder
“Hello World” becomes JxF12TrwUP45BMd in Base58, using the Bitcoin alphabet of 58 characters without zero, capital O, capital I or lowercase l, so codes stay readable on paper and on screen. It decodes back, too. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Text
- Hello World
- Calculation mode
- Encode
- Result
- JxF12TrwUP45BMd
- Input
- Hello World
- Base58
- JxF12TrwUP45BMd
- Alphabet name
- bitcoin
A Base58 encoder turns ordinary UTF-8 text into a compact string that uses only fifty-eight unambiguous characters, and a Base58 decoder reverses that mapping so you get the original text back. This tool uses the Bitcoin alphabet: digits and letters without zero, capital O, capital I, or lowercase L, the four glyphs that humans most often confuse when reading handwritten notes, QR printouts, or wallet addresses. Developers check address-like strings, teachers demonstrate alternative radices, and scripts need deterministic round-trips without installing a crypto library.
What Bitcoin Base58 is and why those four characters are missing
Base58 is a binary-to-text encoding that maps an arbitrary byte sequence onto a fifty-eight-symbol alphabet. Unlike Base64, it drops characters that are hard to tell apart in print and speech: the digit zero, the capital letter O, the capital letter I, and the lowercase letter L. The Bitcoin project popularized one concrete ordering of the remaining symbols—one through nine, then A–Z without I and O, then a–z without l—and that ordering is what wallets, many blockchain explorers, and this capability use.
Encoding walks the input bytes as a big-endian integer in base two hundred fifty-six, repeatedly divides by fifty-eight, and maps each remainder to the alphabet; leading zero bytes become leading ones in the output, the same convention Bitcoin addresses follow. Decoding reverses the map: each character becomes a digit zero through fifty-seven, the big integer is rebuilt, and the byte array is recovered with the same leading-one rule.
Because the alphabet has no padding character, length alone does not imply a fixed block size the way Base64 does; round-trips still work as long as both sides agree on the alphabet and the leading-zero convention. When a character outside the alphabet appears—zero, O, I, l, punctuation, or whitespace—the decoder must fail loudly.
What you can do with it
Human-safe short codes for print and QR
Encode short labels so printed codes avoid 0/O/I/l confusion when staff type them from paper or phone cameras.
Teaching alternative radices and Bitcoin alphabet
Classrooms and workshops encode Hello World, inspect the alphabet, then force invalid characters to show strict validation.
FAQ
What alphabet does this Base58 encoder use?
The Bitcoin alphabet: 123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz. It excludes 0, O, I, and l.
Is Base58 the same as Base64?
No. Base64 uses sixty-four symbols including +, /, and padding =, and it keeps 0 and O. Base58 is shorter on ambiguous glyphs and is common in Bitcoin-style strings.
Does this validate full Bitcoin addresses?
No. It only encodes and decodes raw UTF-8 text under the Bitcoin Base58 alphabet. It does not check version bytes or double-SHA256 checksums.
Is the Base58 encoder free?
The browser tool is free and runs locally.
Why is my Base58 string rejected when I decode it?
Because it contains a character outside the Bitcoin alphabet, such as zero, capital O, capital I, lowercase l, punctuation or a space. The decoder stops with a clear message instead of quietly turning it into different text.
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/enc/base58 \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"Hello World"}'const res = await fetch("https://api.kit.forhosting.com/enc/base58", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"text": "Hello World"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/enc/base58",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"text": "Hello World"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/enc/base58", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"text":"Hello World"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"text":"Hello World"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/enc/base58", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"text": "Hello World"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "enc.base58",
"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_chars | 100000 |
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
Choose encode to convert plain text into Base58, or decode to recover UTF-8 from a Base58 payload; invalid alphabet characters return a clear invalid_input error instead of silent corruption.
What Bitcoin Base58 is and why those four characters are missing
Silent substitution would invent a different payload and is worse than a hard error for wallets, checksums, and automated tests. This landing targets people searching for a Base58 encoder, Base58 decoder, or Bitcoin alphabet converter online; it is not Base64, not Base32, and not a full Bitcoin address validator with version bytes and checksums.
How to call the API and what the response contains
The default mode is encode: UTF-8 bytes of text become a Base58 string under the Bitcoin alphabet. Send a JSON body with a required string field text (aliases input, value, and data) and an optional mode that is either encode or decode. Mode decode treats text as a Base58 payload and returns the recovered UTF-8 string. Input length is capped at one hundred thousand characters so a single request cannot exhaust Worker memory on pathological big-integer expansion. On success for encode, the response includes mode, input, result and base58 with the same encoded string, alphabet with the full fifty-eight-character constant, alphabet_name set to bitcoin, input_bytes as the UTF-8 byte count, output_length as the encoded character count, and a short English message. On success for decode, the response includes mode, input, result and text with the decoded UTF-8 string, the same alphabet fields, input_length, output_bytes, and a matching message. Failed validation—missing text, non-string text, oversize input, an unknown mode, an invalid Base58 character, or decoded bytes that are not valid UTF-8—returns invalid_input and is never charged. Pricing is a flat $0.002 per successful request with unit item and zero marginal unit price.
Practical tips, limits, and how this differs from Base64
Round-trip checks are the fastest smoke test: encode a known phrase such as Hello World, confirm the classic result JxF12TrwUP45BMd, then decode that string and confirm you recover the original phrase byte-for-byte. Prefer Base58 when human transcription safety matters more than density; prefer Base64 when you need maximum bits per character and machine-only transport. When teaching, show the same sentence encoded under Base58 and Base64 side by side so learners see why the Bitcoin alphabet looks different and why copy-paste errors drop when the four ambiguous glyphs are gone. Deliberately include a forbidden character—digit zero, capital O, capital I, or lowercase L—in a decode request to assert that your client handles invalid_input and the error message that names the index and the excluded glyphs. Keep payloads under the published character limit; extremely long strings expand as big integers and are better split or handled offline. This tool is not a Bitcoin address parser: it does not strip a version prefix, recompute a double-SHA256 checksum, or classify mainnet versus testnet. It is also not Base64 or Base64URL—those alphabets include plus, slash, and equals padding, and they keep zero and capital O. Failed tasks that return invalid_input do not consume prepaid balance, which keeps exploratory scripts cheap when you fuzz invalid alphabet characters.
Integration use cases
Wallet and fixture round-trips in tests
Generate known Base58 strings from fixture text and assert decode recovers the same UTF-8 bytes in CI without a crypto dependency.
Technical questions
What happens if I decode a string containing 0, O, I, or l?
The API returns invalid_input, names the bad character and its index, and reminds you that Bitcoin Base58 excludes those four glyphs. Failed tasks are not charged.