JWT Decoder
Developer & Author —Egor VolchenkoThis JWT decoder reads the first two Base64URL segments of a JSON Web Token and displays its header and payload as JSON. Use it to inspect test claims and algorithm metadata during debugging. Decoding does not authenticate the token or check its expiration.
How to use JWT Decoder
Follow these steps to check the input and read the result.
Inspect a token’s readable claims
- Type or paste the token itself without a Bearer prefix into JSON Web Token (JWT).
- Leave Input Encoding: at UTF-8. The decoder reads JWT segments directly; changing this selector does not select another JWT format.
- Keep Auto / Live on to update the result as you edit. To process it manually, turn Auto / Live off and click Run.
- Read Decoded JWT Header & Payload and check the result before using it.
- Click Copy to copy the result. Use Clear where shown, or a field’s clear control, to clear the text before starting again.
For a synthetic example, enter eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkZW1vIn0.test. The decoded header contains "alg": "HS256" and the payload contains "sub": "demo". The final segment is a dummy value, not a valid signature.
Separate readable claims from trust
Fields such as sub, iss, and exp are claims made by the token. This form does not check a signing key, issuer, audience, or time constraints. Treat the displayed values as untrusted until your application validates them.
Recognize partial or malformed input
A normal signed compact token has three dot-separated parts. This implementation can still decode two parts and returns null for a header or payload it cannot parse. Neither readable output nor null output is a complete token-validity decision.
Frequently asked questions
No. The header and payload of an ordinary signed JWT are Base64URL-encoded and can be read without the signing key. A key is needed for signature verification, which this form does not perform.
API — JWT Header & Payload Viewer
Automate this tool directly from your scripts, CI/CD pipelines, or backend applications via HTTP POST.
https://million.tools/api/v1/run/jwt-decoder Request Parameters (JSON / Form Data)
-
start(orinput)JSON Web Token (JWT)
-
input_encodingInput Encoding
hexhex_ignore_non_hexbase64utf-8utf-16leutf-16bewindows-1251windows-1252
curl -X POST https://million.tools/api/v1/run/jwt-decoder \
-H "Content-Type: application/json" \
-d '{"start":"eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjMifQ.signature"}' const response = await fetch('https://million.tools/api/v1/run/jwt-decoder', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"start": "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjMifQ.signature"
}),
});
const data = await response.json();
console.log(data.result); import requests
response = requests.post(
'https://million.tools/api/v1/run/jwt-decoder',
json={
"start": "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjMifQ.signature",
},
timeout=15,
)
data = response.json()
print(data['result']) $ch = curl_init('https://million.tools/api/v1/run/jwt-decoder');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode([
'start' => 'eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjMifQ.signature',
]),
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
echo $response['result'] ?? ''; {
"status": "success",
"tool": "jwt-decoder",
"service": "jwt_decoder",
"result": "{\n \"header\": {\n \"alg\": \"HS256\"\n },\n \"payload\": {\n \"sub\": \"123\"\n }\n}",
"results": {
"result": "{\n \"header\": {\n \"alg\": \"HS256\"\n },\n \"payload\": {\n \"sub\": \"123\"\n }\n}"
}
}
Hi! I’m a WordPress developer with over 10 years of experience. I love Tailwind CSS, clean code, and intuitive interfaces. I’m currently working on million.tools — a service with convenient online tools for everyday tasks. I’m building it from scratch with great attention to detail and user experience.
Ratings & feedback 0
Share your experience with this tool.
No feedback yet
Be the first to leave a review or rating.