ForHosting KIT · Developer Utilities

Base58Check encoder & decoder

Bitcoin address data of 21 bytes becomes 16UwLL9Risc3QfPqBUvKofHmBQ7wMtjvM, 33 characters carrying a four-byte double SHA-256 checksum, so a mistyped character fails the check instead of decoding to the wrong bytes. Free in your browser.

  • Free
  • Runs in your browser
  • No sign-up
  • Your data stays on your device
Use it from WebAPIEmailTelegramApp soon
If you enter
Calculation mode
Encode
Output format
Hex
You get
Result
16UwLL9Risc3QfPqBUvKofHmBQ7wMtjvM
Base58check
16UwLL9Risc3QfPqBUvKofHmBQ7wMtjvM
Checksum hex
d61967f6
Alphabet name
bitcoin

Unlike plain Base58, a single flipped character almost always fails checksum verification instead of silently decoding to wrong bytes—critical for wallet addresses, WIF private keys, and any string humans copy by hand.

Why plain Base58 needs a checksum

Base58 turns bytes into 58 characters that are hard to confuse, leaving out zero, capital O, capital I and lowercase l. That makes a string easy to read, but it does nothing to protect it: one mistyped character is simply another valid string that decodes to different bytes. Base58Check closes that gap. Before encoding, it runs SHA-256 over your data, runs SHA-256 again over that result and appends the first four bytes of the second hash. The whole sequence is then written with the Bitcoin Base58 alphabet. Those four extra bytes leave roughly a one in four billion chance that a single-character typo goes unnoticed, which is why Bitcoin P2PKH addresses, WIF private keys and many extended keys use this format.

How to encode, decode and avoid the usual slips

To encode, enter your data as hexadecimal, the default, or switch to plain text. The 21-byte example 00010966776006953D5567439E5E39F86A0D273BEE becomes 16UwLL9Risc3QfPqBUvKofHmBQ7wMtjvM, 33 characters that already carry the checksum d61967f6. To decode, paste a Base58Check string: the checksum is recalculated and compared with the stored one, and any mismatch stops with a clear message. Typical slips are hexadecimal with an odd number of digits, a string copied with one character missing or added, and expecting the tool to say which network or address type a string belongs to. It checks integrity only and does not interpret version bytes.

Copy-paste integrity for ops tools

Encode versioned binary labels so staff paste strings that fail closed on typos instead of decoding to silent wrong bytes.

What is the difference between Base58 and Base58Check?

Base58 only maps bytes to the Bitcoin alphabet.

Which alphabet does this Base58Check tool use?

The Bitcoin alphabet: 123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz. It excludes 0, O, I, and l.

Is the Base58Check encoder free?

The browser tool is free and runs locally.

What happens if the checksum does not match when I decode?

The decoder recalculates the double SHA-256 checksum from the data and compares it with the four bytes stored in the string. If they differ, it stops with a clear message instead of handing you bytes that are probably wrong.

Should I enter my data as hexadecimal or as plain text?

Hexadecimal is the default and needs an even number of hex digits, like the 21-byte example on this page. Choose plain text when you want to protect ordinary UTF-8 words; on decode, the same choice decides how the recovered data is shown.

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.

POSThttps://api.kit.forhosting.com/enc/base58-check

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.

curl -X POST https://api.kit.forhosting.com/enc/base58-check \
  -H "Authorization: Bearer $KIT_KEY" \
  -H "Content-Type: application/json" \
  -d '{"text":"00010966776006953D5567439E5E39F86A0D273BEE"}'
{
  "text": "00010966776006953D5567439E5E39F86A0D273BEE"
}
{
  "task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
  "type": "enc.base58_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.

Per request$0.002

Published price — no tokens, no invented credits. A failed task is never charged.

HTTPCodeMeaning
401unauthorizedMissing or invalid API key.
402insufficient_balanceYour balance doesn't cover the task price.
404unknown_typeThat task type doesn't exist.
429rate_limitedToo many requests. Use the webhook instead of polling.

Base58Check is the Bitcoin binary-to-text format that wraps a payload with a four-byte checksum derived from double SHA-256, then encodes the whole sequence with the Bitcoin Base58 alphabet. This Base58Check encoder accepts a hex or UTF-8 payload and returns a Base58Check string; the decoder reverses the map, recomputes SHA256(SHA256(payload)), and reports a clear invalid_input error when the stored checksum does not match.

What Base58Check adds on top of Base58

Base58Check closes that gap. Four checksum bytes give roughly one in four billion chance of an undetected single-character typo in practice, which is why Bitcoin P2PKH addresses, many extended keys, and related tools standardize on this construction. This landing targets people searching for a Base58Check encoder, Base58Check decoder, or Bitcoin checksum converter online; it is not plain Base58 without a checksum, not Base64, and not a full address-type classifier that interprets version bytes for every network. Plain Base58 maps bytes to fifty-eight unambiguous characters by treating the payload as a big-endian integer and repeatedly dividing by fifty-eight, using the Bitcoin alphabet that drops zero, capital O, capital I, and lowercase L. That encoding alone is human-friendly but has no integrity protection: one mistyped glyph becomes another valid string that decodes to different bytes. Before encoding, the encoder computes SHA-256 of the payload, then SHA-256 of that digest, and appends the first four bytes of the outer hash as a checksum. The combined buffer—original payload plus those four bytes—is then Base58-encoded exactly like raw Base58, including the leading-zero to leading-one convention. On decode, the process runs in reverse: Base58 decode yields bytes; the last four are the claimed checksum; double SHA-256 of the remaining payload must equal those four bytes or the operation fails.

How to call the API and what the response contains

With format utf8, text is encoded as UTF-8 bytes before checksumming. Send a JSON body with a required string field text (aliases input, value, data, and payload), an optional mode of encode or decode (default encode), and an optional format of hex or utf8 (default hex). Whitespace inside hex is stripped; odd length or non-hex digits return invalid_input. Decode mode treats text as a Base58Check string under the Bitcoin alphabet, verifies the double-SHA256 checksum, and returns the payload as lowercase hex when format is hex, or as a UTF-8 string when format is utf8 (binary payloads that are not valid UTF-8 must use hex). On successful encode the response includes mode, format, input, result and base58check with the same encoded string, payload_hex, checksum_hex, the alphabet constant and alphabet_name bitcoin, payload_bytes, output_length, and a short English message. On successful decode you also get checksum_valid set to true, input_length, and a message confirming verification. Failed validation—missing text, bad hex, unknown mode or format, invalid Base58 characters, payloads too short to hold a checksum, or checksum mismatch—returns invalid_input and is never charged. Pricing is a flat $0.002 per successful request with unit item.

Practical tips, classic vectors, and how this differs from plain Base58

Use sibling plain Base58 when you only need alphabet conversion without checksums; use this Base58Check capability when integrity matters. Prefer encode when you hold a version-prefixed hash or other binary payload in hex and need a paste-safe string with integrity; prefer decode when you already hold a Base58Check address-like string and must recover the payload only if the checksum is intact. Round-trip smoke tests are straightforward: encode the well-known hex payload zero zero zero one zero nine sixty-six seventy-seven sixty zero six ninety-five three D fifty-five sixty-seven forty-three nine E five E thirty-nine F eight six A zero D twenty-seven three B E E and confirm the result sixteen U w L L nine R i s c three Q f P q B U v K o f H m B Q seven w M t j v M, then decode that string and confirm payload_hex and checksum_hex d six one nine six seven f six. Deliberately flip the last character of a valid string and assert that your client handles invalid_input with a message that names both the received and expected four-byte checksums. Keep requests under the published character limit; extremely long payloads expand as big integers and are better split offline. Failed tasks that return invalid_input do not consume prepaid balance, which keeps exploratory scripts cheap when you fuzz bad checksums. When teaching, show the same payload encoded with and without the checksum so learners see why Bitcoin-style strings are longer and why a single-character typo almost always fails closed instead of opening the wrong wallet.

Wallet and address fixture tests

Build CI fixtures from known hex payloads, assert Base58Check encode matches golden strings, and reject tampered addresses via checksum mismatch.

Teaching double-SHA256 checksums

Classrooms encode a classic Bitcoin vector, inspect checksum_hex, then flip one character to demonstrate invalid_input.

What happens if the checksum does not match?

Decode returns invalid_input with a message that includes the received and expected four-byte checksums in hex. Failed tasks are not charged.

Should my payload be hex or plain text?

Default format is hex (even-length hex digits), which matches Bitcoin tooling. Set format to utf8 only when the payload is genuine UTF-8 text.

Read the full KIT documentation →