EthicalFusion

JWT Decoder

Decode a JWT and inspect its header and payload (no verification).

Was this tool helpful?

Thanks for the feedback!

The JWT Decoder splits a JSON Web Token into its parts and shows the header and payload as formatted JSON, so you can see which algorithm signed it, who it was issued to and when it expires. It is a debugging aid for developers working with login systems, OAuth providers and APIs. It does not check the signature.

Anatomy of a token

A JWT (RFC 7519) is three Base64URL-encoded sections joined by dots: header.payload.signature. Both the header and payload usually begin with eyJ, the encoded form of an opening {" followed by a key name. Decoding a sample token gives:

HEADER:
{
  "alg": "HS256",
  "typ": "JWT"
}

PAYLOAD:
{
  "sub": "user_1024",
  "name": "Asha Verma",
  "role": "editor",
  "iat": 1758787200,
  "exp": 1758790800
}

The third section, the signature, is ignored. A token without it (just header.payload) still decodes.

Reading the standard claims

ClaimMeaning
issIssuer, the service that created the token
subSubject, usually the user ID
audAudience, the API the token is meant for
expExpiry time
nbfNot valid before this time
iatIssued-at time
jtiUnique token ID

Times are Unix timestamps in seconds and are shown as raw numbers. In the example, iat 1758787200 is 25 September 2025, 08:00 UTC (1:30 pm IST), and exp 1758790800 is exactly one hour later. The Unix Timestamp Converter turns these into dates. A "token expired" error from an API is often explained by comparing exp with the current time, or by a server clock that is out of sync.

Decoding is not verifying

Anyone can create a token with any payload; only the signature proves it came from the real issuer and wasn't altered. Your server must verify it with the secret (for HS256) or the issuer's public key (for RS256 or ES256) before trusting any claim, and must reject tokens whose header says "alg": "none". Likewise, the payload is only encoded, not encrypted, so never put passwords, Aadhaar numbers or other secrets in it.

Errors and how to fix them

  • "Not a JWT" means the input has no dot, so it has fewer than two parts.
  • "Invalid character" usually means you copied the Bearer prefix from an Authorization header. Paste only the token.
  • "URI malformed" or a JSON error appears for encrypted tokens (JWE, with five parts), whose second part is ciphertext rather than JSON.

A live token works like a password until it expires. Decoding here happens entirely in your browser, but prefer expired or test tokens when you only need to see the structure. To decode a single Base64 segment by hand, see the Base64 Decoder.

Frequently asked questions

Does the JWT decoder verify the signature?
No. It only decodes the header and payload. Signature verification needs the secret or public key and must be done on your server.
Can anyone read the contents of a JWT?
Yes. A standard signed JWT is only Base64URL-encoded, so its payload is readable by anyone who has the token. Do not store secrets in it.
Why do I get "Invalid character" when decoding?
Most often the word Bearer and a space were copied along with the token. Remove them and paste only the three dot-separated parts.
How do I read the exp value?
It is the expiry time in seconds since 1 January 1970 UTC. Convert it with a Unix timestamp converter to see the date and time.
Is it safe to paste my token here?
Decoding runs locally in your browser. A valid token still grants access until it expires, so avoid sharing it and use test tokens where possible.

Related tools

Embed this tool on your site

Paste it into any blog or website. Free, with a credit link.