JWT Decoder

Inspect the header, claims and expiry of a JSON Web Token without sending it anywhere.

Or drop a .txt file containing the token onto the box above.

This decodes the token so you can read its contents. It does not verify the signature: that requires the secret or public key the token was signed with, which never leaves your own server.

How to use

  1. Paste the token. A leading Bearer copied from an Authorization header is ignored, as are spaces and line breaks.
  2. Read the Issued / Expires / Not before row: each is shown in UTC with a relative time, and Expires is marked expired or valid against your device clock.
  3. Read the Header (algorithm and type) and Payload (the claims) as formatted JSON.
  4. Copy header or Copy payload to paste into a bug report or a test.

What's inside a JWT

A JSON Web Token is three pieces of Base64URL-encoded JSON joined by dots: a header describing how the token is signed, a payload holding the actual claims (user ID, roles, expiry, and whatever else the issuer put in), and a signature. The header and payload are encoded, not encrypted; anyone who has the token can read them, which is exactly why JWTs travel over HTTPS and why sensitive data should not go in the payload. The format is defined in RFC 7519; the Base64URL alphabet it uses is the same one the Base64 tool offers as “URL-safe”.

This is why a JWT debugger is genuinely useful during development: when an API call fails with a 401, decoding the token you sent instantly answers the two most common questions: did it expire, and does the payload actually contain the claim the server is checking for?

Example

The token behind the Load sample button:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkFkYSBMb3ZlbGFjZSIsImlhdCI6MTcwMDAwMDAwMCwiZXhwIjoyMDAwMDAwMDAwfQ.
dozjgNryP4J3jVmNHl0w5N_XgL0n3I9PlFUP0THsR8U

decodes to this header and payload:

{
  "alg": "HS256",
  "typ": "JWT"
}
{
  "sub": "1234567890",
  "name": "Ada Lovelace",
  "iat": 1700000000,
  "exp": 2000000000
}

The exp claim, 2000000000, is shown as 2033-05-18 03:33:20 UTC and marked valid, because that is later than now. The signature segment is displayed but not checked.

Reading the result

Edge cases and common errors

Verifying a token instead of just reading it

If you need to confirm a token is authentic (not just well-formed), that check has to happen wherever the signing key lives, typically your backend:

Node.js

const jwt = require("jsonwebtoken");
const payload = jwt.verify(token, secretOrPublicKey);   // throws if the signature does not match

Python

import jwt  # pip install pyjwt
payload = jwt.decode(token, secret_or_public_key, algorithms=["HS256"])

Both libraries also check exp and nbf for you. Decoding alone, as this page does, cannot tell you any of that.

JWT Decoder FAQ

Does this verify the token is genuine?

No. Decoding and verifying are different operations. Decoding just reads the header and payload, which are Base64URL-encoded but not encrypted, so anyone can read them. Verifying checks the signature against the secret or public key the token was signed with, which this page never has and never asks for.

Is it safe to paste a real production token here?

The token is decoded entirely in your browser and never transmitted anywhere, so pasting one is no different from opening it in a debugger on your own machine. That said, treat access tokens as credentials: avoid pasting them into shared screens or saving them in files you don’t control.

What do exp, iat and nbf mean?

iat is when the token was issued, exp is when it expires, and nbf ("not before") is when it becomes valid; all three are Unix timestamps in seconds since 1970, which this tool converts to a readable UTC date and a relative time like "in 2 hours". To convert one by hand outside a token, use the Unix Timestamp Converter.

Why do I see three sections separated by dots?

A JWT is always header.payload.signature: three Base64URL segments joined by periods. The header names the signing algorithm, the payload carries the claims (the actual data), and the signature is what a server checks to confirm neither part was tampered with.

Runs entirely in your browser: this page is a static file with no server behind it, so nothing you paste can be uploaded. Last reviewed by Parthesh Gupta. Implements RFC 7519 (JSON Web Token).