JSON URL Decode Online
Paste a percent-encoded JSON string and decode it back to readable, pretty-printed JSON. Copies from browser DevTools, curl output, API access logs, and network requests are decoded in one click: no manual character replacement, no regex.
Where you actually encounter percent-encoded JSON
Percent-encoded JSON turns up in the places you are least prepared for it: in the middle of a curl debug session, in a browser network request you are trying to reproduce, in a mobile analytics event payload, or in a support ticket that contains a raw URL. Every time you see a query parameter starting with %7B (the encoding of {) or %5B (the encoding of [), that is JSON waiting to be decoded.
Concrete example
Encoded: from a URL query string or network log
%7B%22userId%22%3A%22u_8842%22%2C%22plan%22%3A%22pro%22%2C%22features%22%3A%5B%22export%22%2C%22api%22%5D%7D
Decoded: readable, formatted JSON
{
"userId": "u_8842",
"plan": "pro",
"features": ["export", "api"]
}Step-by-step: copying from browser DevTools
- Open DevTools (F12 or Cmd+Option+I), go to the Network tab.
- Reload the page or trigger the API call you want to inspect.
- Click the request in the list. Go to Headers → scroll to Query String Parameters.
- Find the JSON parameter (usually named
filter,query,state, or similar). Right-click the value → Copy. - Paste into this tool and click Decode →.
Common decoding problems and what they mean
%25 in the input, which is an encoded %.+ with %20 before decoding: or use a form-encoded decoder.% sign that is not followed by two hex digits, or an incomplete multibyte sequence. This occurs when part of the encoded value was truncated during copy.Privacy
All decoding runs client-side using the browser's native decodeURIComponent function. No request is made to any external server. Open DevTools → Network while using this tool: you will see zero outbound requests. This matters when decoding URLs that include session tokens, user data, or internal API credentials embedded in filter parameters.
Frequently asked questions
My decoded JSON still shows percent-sequences: why is it double-encoded?
Double-encoding happens when encodeURIComponent is called on an already-encoded string. The first decode produces another encoded string. Run this tool a second time on the output. Look for %25 in the original: %25 is the encoding of %, which only appears if encoding was stacked.
The decoded output has + symbols where I expected spaces: what is happening?
Two URL encoding conventions exist: RFC 3986 (encodeURIComponent) encodes spaces as %20, and HTML form encoding (application/x-www-form-urlencoded) encodes spaces as +. If the original form used the form-encoding convention, replace all + with %20 before decoding here.
How do I extract the correct value to paste: from DevTools, not the address bar?
Browsers display URLs in the address bar with minimal encoding for readability. For reliable decoding, use DevTools → Network → click the request → Headers → Query String Parameters → right-click the value → Copy. This gives you the actual encoded string sent to the server.
I pasted the full URL including the domain. Will that work?
Pasting the full URL will decode all %XX sequences across the entire URL: path, domain, and all parameters simultaneously. The output will be the full URL with sequences decoded, not a clean JSON object. Extract just the parameter value (the part after = and before & ) for a clean result.
Does the tool validate the decoded JSON?
Yes. After decoding, the result is passed through JSON.parse. If it is valid JSON, the pretty-printed version is shown. If not, the raw decoded string is displayed with the parse error so you can diagnose whether the problem is in the encoding or the original JSON.
Can I decode JSONL (multiple JSON lines) from a URL?
Yes: if the encoded string contains newlines (encoded as %0A), the tool will decode them and show the multi-line result. JSONL in URL parameters is rare because of size limits, but the decoder handles it.
Is there a risk of the decoded JSON being sent to your server?
No. Decoding uses the browser's built-in decodeURIComponent function entirely locally. No network request is made. The JSON you decode never leaves your device.
Related tools