JWT Decoder
Decode and inspect JWT (JSON Web Token) headers and payloads without verifying the signature.
Did this tool work for you?
How to use this calculator
- 1
Paste your JWT token into the text area.
- 2
The header and payload are decoded and displayed.
- 3
Expiry time is shown if the token includes an "exp" claim.
- 4
Important: this tool only decodes — it does NOT verify the signature.
Frequently asked questions
Does decoding a token prove it is genuine?
No. Anyone can build a token with any payload, so a decoded payload says only what the token claims. Proof comes from checking the signature against the issuer’s secret or public key, and this tool does not do that. Every result ends with the note that the signature is not verified. Use the output to debug and inspect, never to decide whether to trust a token.
Why does a token with "alg": "none" decode without complaint?
Because decoding does not look at the signature. A token whose header says none and whose third part is empty is displayed like any other, with an empty Signature row. A server accepting such a token would be accepting unsigned data, so treat the none algorithm shown in the Algorithm row as a warning sign when you meet it in something that is supposed to be protected.
What does the EXPIRED or NOT YET VALID label mean?
It compares the exp or nbf claim with the clock of the device you are using. EXPIRED is added when exp is in the past, and NOT YET VALID when nbf is in the future. There is no allowance for clock differences between servers, which real validators often add, and a wrong device clock gives wrong labels.
The expiry shows a date in the year 55840. What happened?
The exp claim is probably in milliseconds. JWT time claims are defined as seconds since 1970, so a 13-digit value is multiplied by 1000 again and lands tens of thousands of years ahead. A token issued by a library that wrote milliseconds is a bug in the issuer, and this display is a quick way to spot it. For example, exp 1700003600000 shows Sun, 20 Dec 55840.
Why do I get "Failed to decode token"?
One of the first two parts is not valid Base64URL text holding a JSON object. Common causes are a truncated copy, a stray character in the middle, or a token that is not a signed JWT at all. A leading "Bearer " or "Authorization:" prefix and surrounding quotes are stripped for you. Tokens with five parts are encrypted JWTs (JWE); the tool reports "got 5" for those because their contents cannot be read without the key.
Are non-English characters in claims displayed correctly?
Yes. The decoded bytes are read as UTF-8, so a name claim of "Zoë Müller" displays as written rather than as garbled letters. Claims that contain escape sequences are shown after JSON parsing and are therefore already unescaped.
Which claims get their own row?
iat, nbf, exp, sub and iss, when present, plus the algorithm and type from the header. Everything else, including aud, jti, scopes, roles and custom claims, is visible in the full Payload (decoded) block but has no separate row. Time claims are shown as UTC dates; the raw numbers stay in the payload block.
Can I paste a token from production?
Tokens often carry user IDs, email addresses and roles, and a live access token can be used by anyone who has it until it expires. Prefer expired or test tokens, or remove the signature part before pasting: the header and payload decode without it, although the tool wants three dot-separated parts, so keep the final dot.
Reading the contents of a JSON Web Token
Three parts, one dot between each
A signed JWT, defined in RFC 7519 on top of the signature format in RFC 7515, is three Base64URL strings joined by dots. The first is a JSON header naming the signing algorithm (alg), usually the type (typ) and sometimes a key identifier (kid). The second is the payload of claims. The third is the signature, which this tool shows as raw text but does not interpret. Base64URL is plain Base64 with - and _ in place of + and /, and without = padding.
| Claim | Meaning | Display |
|---|---|---|
| iss | Issuer of the token | Own row |
| sub | Subject, usually a user ID | Own row |
| aud | Intended recipient | In payload block |
| exp | Expiry time | Own row, EXPIRED flag |
| nbf | Not valid before | Own row, NOT YET VALID flag |
| iat | Issued at | Own row |
| jti | Unique token ID | In payload block |
Worked examples
A token with the header {"alg":"HS256","typ":"JWT"} and the claims sub 1234567890, name "Zoë Müller", iss https://auth.example.com, iat 1700000000 and exp 1700003600 decodes to Algorithm HS256, Type JWT, Issued At Tue, 14 Nov 2023 22:13:20 GMT and Expires Tue, 14 Nov 2023 23:13:20 GMT with the EXPIRED label. A second token signed with RS256 and carrying kid key-1, nbf 4102444800 and exp 4102448400 shows Not Before Fri, 01 Jan 2100 00:00:00 GMT marked NOT YET VALID, with an expiry one hour later and no flag.
Decoding is not verifying
The header and payload are not encrypted, only encoded, so anyone holding a token can read them, which is why secrets do not belong in claims. What stops forgery is the signature, produced with a shared secret (HS256) or a private key (RS256) and checkable only by software that has the matching key. This page performs no such check, so a forged token and a real one look identical here. The two safety checks worth doing by eye are the algorithm, where none means no signature at all, and the time claims.
Time claims are in seconds
RFC 7519 defines exp, nbf and iat as seconds since 1 January 1970 UTC. The tool converts each to a UTC date, and compares exp and nbf with your device’s clock to add the EXPIRED or NOT YET VALID labels. Real validators usually allow a small clock difference; this one does not. A date in the year 55840 means the issuer wrote milliseconds. If you need to convert one of these numbers separately, the Unix Timestamp Converter does it.
What it cannot read
Encrypted tokens (JWE) have five parts and are rejected with a message giving the count found. Tokens with a payload that is not a JSON object, or with a header or payload that is not valid Base64URL, produce the "Failed to decode" error. Nested tokens, JSON Web Key sets and opaque tokens that are not JWTs are out of scope. The tool never contacts the issuer, so it cannot tell you whether the key ID is current or the token has been revoked.
Learn more from an authoritative source:
MDN Web DocsCron Expression Generator
Generate and explain cron expressions — pick a preset or write your own.
Slug Generator
Convert any title or phrase into a clean URL slug — lowercase, hyphenated, SEO-friendly.
DNS Lookup
Look up any DNS record type (A, AAAA, MX, NS, CNAME, TXT, SOA) for any domain — powered by Cloudflare DNS.
MX Lookup
Check the mail exchange (MX) records for any domain to see which mail servers receive email for it.
NS Lookup
Find the authoritative nameservers (NS records) for any domain to see who controls its DNS.
CNAME Lookup
Check CNAME (canonical name) records for any domain to see where it is aliased to.
Results are estimates for informational purposes only and do not constitute professional financial, medical, legal, or technical advice. Read full disclaimer →